访问者模式

2018-09-25  本文已影响0人  wxz1997

一、定义

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

  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();
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读