访问者模式
来源:互联网 发布:万能淘宝网商城 编辑:程序博客网 时间: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
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 访问者模式
- 浅析java中的关键字:final和static
- 以太网,IP,TCP,UDP数据包分析
- linxu系统引导&运行级别&chkconfig&/etc/rc/init.d&/etc/rc/rc*.d
- 全排列
- Spark实战-Spark SQL(二)
- 访问者模式
- error C2899: typename cannot be used outside a template declaration
- java之yield(),sleep(),wait()区别详解-备忘笔记
- acm 1013 公司盈利
- 感知哈希算法原理与实现
- nyoj 205 大数求余 简单题
- 关于可编辑输入框的focus设置
- ZOJ 1654 Place the Robots【二分图匹配】
- 10006---Trail ~ Integration in the hMC