设计模式之访问者模式

  1. 简单梳理访问者模式
    1. 访问者模式的实现
      1. 定义业务方法
      2. 执行结果
      3. 结果分析
  2. 联系作者
    1. 微信公众号
    2. QQ群

简单梳理访问者模式

访问者模式的实现

生活中,一个成功的男人背后往往有一个伟大的女人,
相反,一个成功的女人背后往往有个拖后腿的男人。。

我们也经常看到成功、失败甚至恋爱中,男人和女人状态时不一致的。

我们来看下这种场景如何用设计模式来实现。

首先我们定义个Person基类,并定义男人和女人的实现类

public abstract class Person {
    public abstract void Accept(Action visitor);
}
public class Man extends Person{
    private String name;

    public Man(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void Accept(Action visitor) {
        visitor.GetManConclusion(this);
    }
}
public class Women extends Person{
    private String name;

    public Women(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void Accept(Action visitor) {
        visitor.GetWomanConclusion(this);
    }
}

定义一个Action基类,用来访问人的状态

public abstract class Action {
    //得到男人的结论
    public abstract void GetManConclusion(Man man);
    //得到女人的结论
    public abstract void GetWomanConclusion(Women women);
}
public class Success extends Action{
    private String status;

    public Success(String status) {
        this.status = status;
    }

    @Override
    public void GetManConclusion(Man man) {
        System.out.println(man.getName()+this.status+"时,背后多半有一个伟大的女人");
    }

    @Override
    public void GetWomanConclusion(Women women) {
        System.out.println(women.getName()+this.status+"时,背后多半有一个不成功的男人");
    }
}
public class Failing extends Action{
    private String status;

    public Failing(String status) {
        this.status = status;
    }

    @Override
    public void GetManConclusion(Man man) {
        System.out.println(man.getName()+this.status+"时,闷头喝酒谁也不用劝");
    }

    @Override
    public void GetWomanConclusion(Women women) {
        System.out.println(women.getName()+this.status+"时,眼泪汪汪谁也劝不了");
    }
}
public class Amativeness extends Action{

    private String status;

    public Amativeness(String status) {
        this.status = status;
    }

    @Override
    public void GetManConclusion(Man man) {
        System.out.println(man.getName()+this.status+"时,凡事不懂也要装懂");
    }

    @Override
    public void GetWomanConclusion(Women women) {
        System.out.println(women.getName()+this.status+"时,凡事懂也装作不懂");
    }
}

再定义一个状态结构类,用来遍历不同人的状态

public class ObjectStructure {
    private List<Person> elements = new ArrayList<>();

    public void Attach(Person element){
        elements.add(element);
    }

    public void Detach(Person element){
        elements.remove(element);
    }

    public void Display(Action visitor){
        for(Person person: elements){
            person.Accept(visitor);
        }
    }
}

这样我们前期的定义就算做完了,
然后我们看具体应用中的使用。

定义业务方法

看在具体业务逻辑中如何使用

public class VisitorTest {
    public static void main(String[] args) {
        //访问者模式
        func1();
    }

    public static void func1(){
        ObjectStructure o = new ObjectStructure();
        o.Attach(new Man("男人"));
        o.Attach(new Women("女人"));

        //成功时
        Success v1 = new Success("成功");
        o.Display(v1);

        //失败时
        Failing v2 = new Failing("失败");
        o.Display(v2);

        //恋爱时
        Amativeness v3 = new Amativeness("恋爱");
        o.Display(v3);
    }
}

执行结果

男人成功时,背后多半有一个伟大的女人
女人成功时,背后多半有一个不成功的男人
男人失败时,闷头喝酒谁也不用劝
女人失败时,眼泪汪汪谁也劝不了
男人恋爱时,凡事不懂也要装懂
女人恋爱时,凡事懂也装作不懂

结果分析

访问者模式,表示一个作用于某对象结构中各元素的操作,
它可以使你在不改变各元素的类的前提下定义作用于这些元素的新操作。

访问者模式适用于数据结构比较稳定的系统,目的是要把处理逻辑从数据结构中分离出来。

联系作者

微信公众号

xiaomingxiaola
(BossLiu)

QQ群

58726094


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com

×

喜欢就点赞,疼爱就打赏

日记本 网文世界