### 訪問者模式
表示一個作用于某對象結構中的各個元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。(摘抄)
從這個名字也可以看出來,這個模式就是針對于對象訪問的模式,這個模式里面的每一各具體訪問者,代表一個具體的操作,當你需要增加操作的時候十分方便,不過這個里面的訪問者類和具體的去訪問的類耦合十分緊密,所以說這個模式的局限性也很大,只適用于數據結構比較穩定的系統,它把數據結構和作用于結構上的操作之間的耦合解開了,轉移到了訪問者類之中。有比較穩定的數據結構,和易于變化的算法的話,使用訪問者模式就十分方便。
~~~
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)男人和女人——訪問者模式