### 访问者模式
表示一个作用于某对象结构中的各个元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。(摘抄)
从这个名字也可以看出来,这个模式就是针对于对象访问的模式,这个模式里面的每一各具体访问者,代表一个具体的操作,当你需要增加操作的时候十分方便,不过这个里面的访问者类和具体的去访问的类耦合十分紧密,所以说这个模式的局限性也很大,只适用于数据结构比较稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解开了,转移到了访问者类之中。有比较稳定的数据结构,和易于变化的算法的话,使用访问者模式就十分方便。
~~~
import java.util.ArrayList;
import java.util.List;
public abstract class Visitor
{
public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}
public abstract class Element
{
public abstract void Accept(Visitor visitor);
}
public class ConcreteElementA extends Element
{
@Override
public void Accept(Visitor visitor) {
// TODO Auto-generated method stub
visitor.visitConcreteElementA(this);
}
}
public class ConcreteElementB extends Element
{
@Override
public void Accept(Visitor visitor) {
// TODO Auto-generated method stub
visitor.visitConcreteElementB(this);
}
}
public class ConcreteVisitor1 extends Visitor
{
@Override
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
// TODO Auto-generated method stub
System.out.println(this.getClass()+" visit "+concreteElementA.getClass());
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
// TODO Auto-generated method stub
System.out.println(this.getClass()+" visit "+concreteElementB.getClass());
}
}
public class ConcreteVisitor2 extends Visitor
{
@Override
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
// TODO Auto-generated method stub
System.out.println(this.getClass()+" visit "+concreteElementA.getClass());
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
// TODO Auto-generated method stub
System.out.println(this.getClass()+" visit "+concreteElementB.getClass());
}
}
public class ObjectStructure
{
private List<Element> lists = new ArrayList<Element>();
public void addElement(Element element)
{
lists.add(element);
}
public void deleteElement(Element element)
{
lists.remove(element);
}
public void Accept(Visitor visitor)
{
for (Element element : lists)
{
element.Accept(visitor);
}
}
}
class Client
{
public static void main()
{
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.addElement(new ConcreteElementA());
objectStructure.addElement(new ConcreteElementB());
ConcreteVisitor1 concreteVisitor1 = new ConcreteVisitor1();
ConcreteVisitor2 concreteVisitor2 = new ConcreteVisitor2();
objectStructure.Accept(concreteVisitor1);
objectStructure.Accept(concreteVisitor2);
}
}
~~~
大多数时候你并不需要访问者模式,但当一旦你需要访问者模式时,那就是真的需要它了。(摘抄)
- 前言
- (1)代码无错就是优?——简单工厂模式
- (2)商场促销——策略模式
- (3)&amp;(4)&amp;(5) 设计模式原则
- (6)穿什么有这么重要?——装饰模式
- (7)为别人做嫁衣——代理模式
- (8)雷锋依然在人间——工厂方法模式
- (9)简历复印——原型模式
- (10)考题抄错会做也白搭——模板方法模式
- (11)迪米特法则
- (12)牛市股票还会亏钱?—— 外观模式
- (13)好菜每回味不同——建造者模式
- (14)老板回来,我不知道——观察者模式
- java实现事件委托
- (15)就不能不还DB吗?—— 抽象工厂模式
- (16)无尽加班何时休息——状态模式
- (17)在NBA我需要翻译——适配器模式
- (18)如果再回到从前——备忘录模式
- (19)分公司=部门——组合设计模式
- (20)想走?可以!先买票——迭代器模式
- (21)有些类也需计划生育——单例模式
- (22)手机软件何时统一——桥接模式
- (23)烤羊肉串引来的思考——命令模式
- (24)加薪非要老总批?——职责链模式
- (25)世界需要和平——中介者模式
- (26)项目多也别傻做——享元模式
- (28)男人和女人——访问者模式