zoukankan      html  css  js  c++  java
  • 设计模式之访问者模式

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

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

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

    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就是“对象结构”类了。

  • 相关阅读:
    C#生成PDF总结
    Oracle删除当前用户下所有的表的方法
    C#操作oracle 到ExecuteNonQuery卡死不执行
    C#中事件的使用
    初探three.js光源
    d3.js 地铁轨道交通项目实战
    初探three.js
    d3.js 绘制北京市地铁线路状况图(部分)
    d3.js 共享交换平台demo
    d3.js 实现烟花鲜果
  • 原文地址:https://www.cnblogs.com/shicaiyou/p/9365178.html
Copyright © 2011-2022 走看看