访问者模式

一,定义

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

访问者模式适用于数据结构相对稳定的系统,他把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

二,示例

我们要实现一个男女在不同情况下的对比展示情况。因为只有男女,所以结构相对稳定

//人 抽象类 接受一个行为
public abstract class Person {
    public abstract void accept(Action action);
}

//行为抽象类 获取男女不同的表现
public abstract class Action {
    public abstract void getManConclusion(Man man);
    public abstract void getWomanConclusion(Woman man);
}

public class Man extends Person {
    public String name = "男人";
    @Override
    public void accept(Action action) {
        action.getManConclusion(this);
    }
}

public class Woman extends Person {
    public String name = "女人";
    @Override
    public void accept(Action action) {
        action.getWomanConclusion(this);
    }
}


public class Success extends Action {
    private String typeName = "成功";
    @Override
    public void getManConclusion(Man man) {
        System.out.println(man.name+typeName+"时,"+"背后多半有一个伟大的女人!");
    }

    @Override
    public void getWomanConclusion(Woman man) {
        System.out.println(man.name+typeName+"时,"+"背后多半有一个不成功的男人!");
    }
}

public class Failing extends Action {
    private String typeName = "失败";
    @Override
    public void getManConclusion(Man man) {
        System.out.println(man.name+typeName+"时,"+"闷头喝酒,谁也不用劝!");
    }

    @Override
    public void getWomanConclusion(Woman man) {
        System.out.println(man.name+typeName+"时,"+"眼泪汪汪,谁劝也没用!");
    }
}

/**
 * @类描述:对象结构
 */
public class ObjectStructure {
    private List<Person> persons = new ArrayList<>();

    public void attach(Person person) {
        persons.add(person);
    }

    public void detach(Person person) {
        persons.remove(person);
    }

    public void display(Action action) {
        for (Person person : persons) {
            person.accept(action);
        }
    }
}

//test main
    //访问者模式
    public static void visitorModel(){
        ObjectStructure structure = new ObjectStructure();
        structure.attach(new Man());
        structure.attach(new Woman());

        Success success = new Success();
        structure.display(success);

        Failing failing = new Failing();
        structure.display(failing);

        Amativeness amativeness = new Amativeness();
        structure.display(amativeness);
    }

输出结果:
男人成功时,背后多半有一个伟大的女人!
女人成功时,背后多半有一个不成功的男人!
男人失败时,闷头喝酒,谁也不用劝!
女人失败时,眼泪汪汪,谁劝也没用!
男人恋爱时,凡事不懂也要装懂!
女人恋爱时,遇事懂也装不懂!

三,总结

优点:

  • 增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者,访问者模式将有关行为集中到一个访问对象中

缺点:

  • 使增加新的数据结构变得很困难

应用场景:

  • 访问者模式适用于数据结构相对稳定的系统,他把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
  • 系统有比较稳定的数据结构,又有易于变化的算法,可以考虑用访问者模式将数据结构和算法分开。

访问者模式的目的是要把处理从数据结构中分离出来。

参考:《大话设计模式》

示例代码:https://github.com/wangxp423/ExerciseDesignmodel

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值