访问者模式

来源:互联网 发布:万能淘宝网商城 编辑:程序博客网 时间:2024/06/13 21:50

Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.
封装一些作用于某种数据结构中的各种元素的操作,他可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

访问者模式的通用类图

这里写图片描述

访问者模式的通用源码

  • 抽象元素

    public abstract class Element {    //定义业务逻辑    public abstract void doSomething();    //允许谁来访问    public abstract void accept(IVisitor visitor);}
  • 具体元素1

    public class ConcreteElement1 extends Element {    @Override    public void doSomething() {        //业务逻辑处理    }    @Override    public void accept(IVisitor visitor) {        visitor.visit(this);    }}
  • 具体元素2

    public class ConcreteElement2 extends Element {    @Override    public void doSomething() {        //处理业务逻辑    }    @Override    public void accept(IVisitor visitor) {        visitor.visit(this);    }}
  • 访问者接口

    public interface IVisitor {    //可以访问的哪些对象    public void visit(ConcreteElement1 el1);    public void visit(ConcreteElement2 el2);}
  • 具体访问者

    public class ConcreteVisitor implements IVisitor {    @Override    public void visit(ConcreteElement1 el1) {        el1.doSomething();    }    @Override    public void visit(ConcreteElement2 el2) {        el2.doSomething();    }}
  • 结构对象

    public class ObjectStruture {    //对象生成器,这里通过一个工厂方法模式模拟    public static Element createElement() {        Random random = new Random();        if(random.nextInt(100) > 50) {            return new ConcreteElement1();        }        else {            return new ConcreteElement2();        }    }}
  • 场景类

    public class Client {    public static void main(String[] args) {        for(int i = 0; i < 10; i++) {            Element el = ObjectStruture.createElement();            el.accept(new ConcreteVisitor());        }    }}

访问者模式的优点

  • 符合但有一点职责原则
  • 优秀的扩展性
  • 灵活性非常高

访问者模式的缺点

  • 具体元素对访问者公布细节
  • 具体元素变更比较困难
  • 违背了依赖倒置原则

访问者模式的使用场景

  • 一个对象结构包含了很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于器具体类的操作,也就是说迭代器莫斯已经不能胜任的情景。
  • 需要对一个对象结构中的对象进行很多不同并且不相关的操作,而你想避免这些操作“污染”这些对象的类。
  • 业务规则要遍历多个不同的对象。
1 0
原创粉丝点击