设计模式之访问者模式
来源:互联网 发布:查询淘宝购物记录 编辑:程序博客网 时间:2024/06/16 00:42
概述:对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同
角色:
- Visitor 为该对象结构中ConcreteElement的每一个类声明一个Visit操作。
该操作的名字和特征标识了发送Visit请求给该访问者的那个类。 这使得访问者可以确定正被访问元素的具体的类。
这样访问者就可以通过该元素的特定接口直接访问它 - ConcreteVisitor 实现每个由Visitor声明的操作。 每个操作实现本算法的一部分,而该算法片断乃是对应于结构中对象的类。
ConcreteVisitor为该算法提供了上下文并存储它的局部状态。 这一状态常常在遍历该结构的过程中累积结果 - Element 定义一个Accept操作,它以一个访问者为参数
- ConcreteElement 实现Accept操作,该操作以一个访问者为参数
- ObjectStructure 能枚举它的元素。 可以提供一个高层的接口以允许该访问者访问它的元素。可以是一个复合或是一个集合,如一个列表或一个无序集合
类图:
实现:
访问者接口:
public interface Visitor { public void visit(ElementA elementA); public void visit(ElementB elementB);}
访问者实现:
public class VisitorA implements Visitor { public void visit(ElementA elementA) { System.out.println("VisitorA"); elementA.method2(); } public void visit(ElementB elementB) { System.out.println("VisitorA"); elementB.method2(); }}
public class VisitorB implements Visitor { public void visit(ElementA elementA) { System.out.println("VisitorB"); elementA.method2(); } public void visit(ElementB elementB) { System.out.println("VisitorB"); elementB.method2(); }}
被访问者接口:
interface Element { public void method1(Visitor visitor); public void method2();}
被访问者实现:
public class ElementA implements Element { public void method1(Visitor visitor) { visitor.visit(this); } public void method2() { System.out.println("ElementA visited"); }}
public class ElementB implements Element { public void method1(Visitor visitor) { visitor.visit(this); } public void method2() { System.out.println("ElementB visited"); }}
操作:
public class Context { List<Element> elementList = new ArrayList<Element>(); public void add(Element element) { elementList.add(element); } public void visit(Visitor visitor) { for(Element element : elementList){ element.method1(visitor); } }}
测试:
public class testVisotor { private static Context ctx = new Context(); public static void main(String[] args) { ctx.add(new ElementA()); ctx.add(new ElementB()); ctx.add(new ElementA()); ctx.add(new ElementB()); ctx.visit(new VisitorA()); ctx.visit(new VisitorB()); }}
打印:
VisitorA
ElementA visited
VisitorA
ElementB visited
VisitorA
ElementA visited
VisitorA
ElementB visited
VisitorB
ElementA visited
VisitorB
ElementB visited
VisitorB
ElementA visited
VisitorB
ElementB visited
0 0
- 设计模式之访问者
- 设计模式之访问者
- 设计模式之访问者模式
- 设计模式之--访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 【设计模式】之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- Equirectangular Projection(ERP)
- android 关于手机文件
- iOS和windows异同点
- 查看刚执行过得SQL文本
- jquery.lazyload.js插件的用法
- 设计模式之访问者模式
- 内部类一些
- JavaScript中的原型(链)&继承(一)
- Mysql limit offset用法举例
- SQL执行
- 浮点数在计算机中存储方式
- react中的ref的使用
- react-native init AwesomeProject
- 前端代码日常收集与监控