• 设计模式之访问者模式


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

    访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式的目的是要把处理从数据结构中分离出来。其实访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加新的访问者,访问者模式将有关的行为集中到一个访问者对象中。访问者模式的缺点就是使增加新的数据结构变得困难了。

    举一个男人、女人在成功、失败、恋爱时,得出不同结论的例子:

    public abstract class Action {
        public abstract void getManConclusion(Man concreteElementA);
        public abstract void getWomanConclusion(Woman concreteElementB);
    }
    public class Success extends Action{
    
        @Override
        public void getManConclusion(Man concreteElementA) {
            // TODO Auto-generated method stub
            String name = concreteElementA.getClass().getName();
            System.out.println(name.substring(name.indexOf(".")+1) + "成功时,背后多半有一个伟大的女人");
        }
    
        @Override
        public void getWomanConclusion(Woman concreteElementB) {
            // TODO Auto-generated method stub
            System.out.println(concreteElementB.getClass().getName() + "成功时背后大多有个不成功的男人");
        }
    
    }
    public class Failing extends Action{
    
        @Override
        public void getManConclusion(Man concreteElementA) {
            // TODO Auto-generated method stub
            System.out.println("闷头喝酒");
        }
    
        @Override
        public void getWomanConclusion(Woman concreteElementB) {
            // TODO Auto-generated method stub
            System.out.println("眼泪汪汪");
        }
    
    }
    public class Amativeness extends Action{
    
        @Override
        public void getManConclusion(Man concreteElementA) {
            // TODO Auto-generated method stub
            System.out.println("凡事不懂也要装懂");
        }
    
        @Override
        public void getWomanConclusion(Woman concreteElementB) {
            // TODO Auto-generated method stub
            System.out.println("凡事懂也装作不懂");
        }
    
    }
    public abstract class Person {
        public abstract void accept(Action visitor);
    }
    public class Man extends Person{
    
        @Override
        public void accept(Action visitor) {
            // TODO Auto-generated method stub
            visitor.getManConclusion(this);
        }
    
    }
    public class Woman extends Person{
    
        @Override
        public void accept(Action visitor) {
            // TODO Auto-generated method stub
            visitor.getWomanConclusion(this);
        }
    
    }
    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 e : elements){
                e.accept(visitor);
            }
        }
    }
    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ObjectStructure o = new ObjectStructure();
            o.attach(new Man());
            o.attach(new Woman());
            
            //成功时的反应
            Success v1 = new Success();
            o.display(v1);
        }
    
    }

    代码结构:

    对比访问者模式图,我们可以看到Element就是我们的"人"类,而ConcreteElementA和ConcreteElementB就是男人和女人,visitor就是我们写得“状态类”,具体的ConcreteVisitor就是那些“成功”,“失败”,“恋爱”等等状态,至于Objectstruct就是“对象结构”类了。

  • 相关阅读:
    Lucene 02
    企业级-Shell案例5——找出占用CPU 内存过高的进程
    企业级-Shell案例4——一键查看服务器利用率
    企业级-Shell案例3——批量创建多个用户并设置密码
    企业级-Shell案例2——发送告警邮件
    企业级-Shell案例1——服务器系统配置初始化
    Centos搭建docker swarm集群详细教程
    Promethus(普罗米修斯)的Grafana+onealert实现报警功能
    Promethus的Grafana图形显示MySQL监控数据
    Promethus(普罗米修斯)安装Grafana可视化图形工具
  • 原文地址:https://www.cnblogs.com/shicaiyou/p/9365178.html
Copyright © 2020-2023  润新知