美文网首页
访问者模式

访问者模式

作者: wxz1997 | 来源:发表于2018-09-25 21:20 被阅读0次

    一、定义

    封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

    1. 优点:符合单一职责原则,具体元素角色负责数据的加载,Visitor
      类则负责报表的展现;在增加对数据的操作方面有优秀的扩展性;灵活性非常高。
    2. 缺点:具体元素对访问者公布细节;具体元素变更比较困难;访问者依赖的是具体元素,而不是抽象元素,违背了依赖倒置转原则,扩展比较难。

    二、实现

    public class Client {
        public static void main(String[] args){
            for(int i=0;i<10;i++){
                //获得元素对象
                Element el = ObjectStruture.createElement();
                //接受访问者访问
                el.accept(new Visitor());
            }
        }
    }
    
    //抽象元素,声明接受哪一类访问者访问
    abstract class Element {
        //定义业务逻辑
        public abstract void doSomething();
        //允许谁来访问
        public abstract void accept(IVisitor visitor);
    }
    
    //具体元素,实现accept方法,通常是visitor.visit(this)
    class ConcreteElement1 extends Element{
        //完善业务逻辑
        public void doSomething(){
            //业务处理
            System.out.println("访问1");
        }
        //允许那个访问者访问
        public void accept(IVisitor visitor){
            visitor.visit(this);
        }
    }
    
    class ConcreteElement2 extends Element{
        //完善业务逻辑
        public void doSomething(){
            //业务处理
            System.out.println("访问2");
        }
        //允许那个访问者访问
        public void accept(IVisitor visitor){
            visitor.visit(this);
        }
    }
    
    //抽象访问者,声明访问者可以访问哪些元素
    interface IVisitor {
        //可以访问哪些对象
        void visit(ConcreteElement1 el1);
        void visit(ConcreteElement2 el2);
    }
    
    //具体访问者,访问到一个类后要做什么事情。
    class Visitor implements IVisitor {
        //访问el1元素
        public void visit(ConcreteElement1 el1) {
            el1.doSomething();
        }
        //访问el2元素
        public void visit(ConcreteElement2 el2) {
            el2.doSomething();
        }
    }
    
    //元素产生者,一般容纳在多个不同类、不同接口的容器,如List、Set、Map等
    class ObjectStruture {
        //对象生成器,这里通过一个工厂方法模式模拟
        public static Element createElement(){
            Random rand = new Random();
            if(rand.nextInt(100) > 50){
                return new ConcreteElement1();
            }else{
                return new ConcreteElement2();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:访问者模式

          本文链接:https://www.haomeiwen.com/subject/imcroftx.html