设计模式之访问者模式
2016-03-14 14:41
274 查看
访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式适用于数据结构相对稳定的系统。
它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
访问者模式的目的是要把处理从数据结构分离出来。
有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
访问者的缺点就是使增加新的数据结构变得困难了。
大多数时候并不需要用访问者模式,但当一旦需要访问者模式时,那就是真的需要它了。
访问者模式基本代码:
Visitor类,为该对象结构中ConcreteElement的每一个类声明一个Visit操作。
public abstract class Visitor {
public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}
ConcreteVisitor1和ConcreteVisitor2类,具体访问者,实现每个由Visitor声明的操作。每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。
public class ConcreteVisitor1 extends Visitor {
@Override
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问");
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问");
}
}
Element类,定义一个Accept操作,它以一个访问者为参数。
public abstract class Element {
public abstract void accept(Visitor visitor);
}
ConcreteElementA和ConcreteElementB类,具体元素,实现accept操作。
public class ConcreteElementA extends Element {
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
public void operationA() {
// 其他相关方法
}
}
ObjectStructure类,能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。
public class ObjectStructure {
private List<Element> mElements = new ArrayList<Element>();
public void attach(Element element) {
mElements.add(element);
}
public void detach(Element element) {
mElements.remove(element);
}
public void accept(Visitor visitor) {
for (Element item : mElements) {
item.accept(visitor);
}
}
}
调用:
ObjectStructure structure = new ObjectStructure();
structure.attach(new ConcreteElementA());
structure.attach(new ConcreteElementB());
ConcreteVisitor1 visitor1 = new ConcreteVisitor1();
structure.accept(visitor1);
输出结果:
ConcreteElementA被ConcreteVisitor1访问
ConcreteElementB被ConcreteVisitor1访问
例子:
访问者模式适用于数据结构相对稳定的系统。
它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
访问者模式的目的是要把处理从数据结构分离出来。
有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
访问者的缺点就是使增加新的数据结构变得困难了。
大多数时候并不需要用访问者模式,但当一旦需要访问者模式时,那就是真的需要它了。
访问者模式基本代码:
Visitor类,为该对象结构中ConcreteElement的每一个类声明一个Visit操作。
public abstract class Visitor {
public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}
ConcreteVisitor1和ConcreteVisitor2类,具体访问者,实现每个由Visitor声明的操作。每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。
public class ConcreteVisitor1 extends Visitor {
@Override
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问");
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问");
}
}
Element类,定义一个Accept操作,它以一个访问者为参数。
public abstract class Element {
public abstract void accept(Visitor visitor);
}
ConcreteElementA和ConcreteElementB类,具体元素,实现accept操作。
public class ConcreteElementA extends Element {
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
public void operationA() {
// 其他相关方法
}
}
public class ConcreteElementB extends Element { @Override public void accept(Visitor visitor) { visitor.visitConcreteElementB(this); } public void operationB() { // 其他相关方法 } }
ObjectStructure类,能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。
public class ObjectStructure {
private List<Element> mElements = new ArrayList<Element>();
public void attach(Element element) {
mElements.add(element);
}
public void detach(Element element) {
mElements.remove(element);
}
public void accept(Visitor visitor) {
for (Element item : mElements) {
item.accept(visitor);
}
}
}
调用:
ObjectStructure structure = new ObjectStructure();
structure.attach(new ConcreteElementA());
structure.attach(new ConcreteElementB());
ConcreteVisitor1 visitor1 = new ConcreteVisitor1();
structure.accept(visitor1);
输出结果:
ConcreteElementA被ConcreteVisitor1访问
ConcreteElementB被ConcreteVisitor1访问
例子:
相关文章推荐
- 几种上传文件组件的性能比较
- 【2016年Esri开发者大会亮点解析】Insights for ArcGIS,Apps家族再添重量级新丁
- iOS中音频
- Software Design Tools for Agile Teams, with UML, BPMN and More
- boostrap-非常好用但是容易让人忽略的地方------row
- 提高SQL查询效率的30种方法
- 各种排序复杂度
- centos系统使用命令查询版本信息
- Android之Adapter结构
- 支付介绍
- Nginx反向代理设置总结
- 关于UITableView
- java 死锁产生原因及解锁
- DB理论--mysql基础
- 【2016年Esri开发者大会亮点解析】Geo Analytics,给力的Big Data分析工具
- 【2016年Esri开发者大会亮点解析】实时GIS再度发力,两大变化激动人心
- Android本地图片或者网络图片高斯模糊效果(毛玻璃效果)图片模糊效果一行代码搞定
- 提升网站性能开发的10个技巧
- Cogs 1070. [焦作一中2012] 玻璃球游戏 带权并查集,逆序处理
- Apple Mach-O Linker Warning 警告解决的方法