Java设计模式之访问者模式

访问者模式(Visitor)

表示一个作用于某对象结构中的个元素的操作,它可以使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
在这里插入图片描述

最简单的编程实现
在这里插入图片描述

简单的面向对象编程
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述这种方法,如果我在加一个结婚的状态,还要修改源码。

Element类:

public abstract class Person {
    protected String gender;
    public abstract void accept(State state);
}

ConcreteElementA:(男人)

public class Man extends Person {
    @Override
    public void accept(State state) {
        super.gender = "男人";
        state.getConclusion(this);
    }
}

ConcreteElementA:(女人)

public class Woman extends Person {
    @Override
    public void accept(State state) {
        super.gender="女人";
        state.getConclusion(this);
    }
}

Visitor;

public abstract class State {
    protected String state;
    public abstract void getConclusion(Man man);
    public abstract void getConclusion(Woman woman);
}

ConcreteVisitorA:

public class Succeed extends State {
    @Override
    public void getConclusion(Man man) {
        System.out.println(man.gender+state+"时,背后多半有一个伟大的女人");
    }

    @Override
    public void getConclusion(Woman woman) {
        System.out.println(woman.gender+state+"时,背后大多有一个不成功的男人");
    }
}

ConcreteVisitorA:

public class Failed extends State {
    @Override
    public void getConclusion(Man man) {
        System.out.println(man.gender+state+"时,闷头喝酒,谁也不用劝");
    }

    @Override
    public void getConclusion(Woman woman) {
        System.out.println(woman.gender+state+"时,眼泪汪汪,谁也劝不了");
    }
}

ObjectStructure:

public class ObjectStructure {
    private List<Person> persons = new ArrayList<>();
    public void addPerson(Person person){
        persons.add(person);
    }
    public void removePerson(Person person){
        persons.remove(person);
    }
    public void display(State state){
        for (Person person : persons) {
            person.accept(state);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        //男人
        Person man = new Man();
        //女人
        Person woman = new Woman();
        ObjectStructure objects = new ObjectStructure();
        objects.addPerson(man);
        objects.addPerson(woman);
        //成功状态
        Succeed succeed = new Succeed();
        succeed.state = "成功";
        objects.display(succeed);
        //失败状态
        Failed failed = new Failed();
        failed.state = "失败";
        objects.display(failed);
    }
}
男人成功时,背后多半有一个伟大的女人
女人成功时,背后大多有一个不成功的男人
男人失败时,闷头喝酒,谁也不用劝
女人失败时,眼泪汪汪,谁也劝不了

如果我要增加一个结婚的状态,我只需要加个结婚的访问者就可以。它把数据结构和操作分离。

访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开使得操作集合可以相对自由的演化。
访问者模式的目的是要把处理从数据结构分离出来。如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的。因为访问者模式使得算法操作的增加变得容易。反之,就不适合。
访问者模式的优点就是增加 新的操作是非常容易的,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
但是访问者的确定点就是使增加新的数据结构变得困难了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值