定義: 表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。 UML類圖: 具體代碼: 模塊說明:Visitor:抽象類或者介面,聲明visit方法中的參數定義哪些對象是可以被訪問的。ConcreteVisitor:具體訪問者實現的對象,實現被添加 ...
定義:
表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。
UML類圖:
具體代碼:
public abstract class Visitor { abstract void visitorConcreteElementA(); abstract void visitorConcreteElementB(); } public class ConcreteVisitorA extends Visitor { @Override public void visitorConcreteElementA() { System.out.println("A"); } @Override void visitorConcreteElementB() { System.out.println("B"); } } public class ConcreteVisitorB extends Visitor { @Override public void visitorConcreteElementA() { } @Override public void visitorConcreteElementB() { } } public abstract class Element { public abstract void accept(Visitor visitor); } public class ConcreteElementA extends Element { @Override public void accept(Visitor visitor) { visitor.visitorConcreteElementA(); } public void operation() { } } public class ConcreteElementB extends Element { @Override public void accept(Visitor visitor) { visitor.visitorConcreteElementB(); } public void operation() { } } public class ObjectStructure { private ArrayList<Element> list = new ArrayList<Element>(); //定義一個集合用於存儲元素對象 public void accept(Visitor visitor) { Iterator i=list.iterator(); while(i.hasNext()) { ((Element)i.next()).accept(visitor); //遍歷訪問集合中的每一個元素 } } public void addElement(Element element) { list.add(element); } public void removeElement(Element element) { list.remove(element); } }
模塊說明:
Visitor:抽象類或者介面,聲明visit方法中的參數定義哪些對象是可以被訪問的。
ConcreteVisitor:具體訪問者實現的對象,實現被添加到對象結構中的功能。
Element:介面或者抽象類,定義接受訪問的介面。
ConcreteElement:實現抽象元素類所聲明的accept方法,通常都是visitor.visit(this),基本上已經形成一種定式了。
ObjectStructure:一個元素的容器,一般包含一個容納多個不同類、不同介面的容器,如List、Set、Map等,在項目中一般很少抽象出這個角色。
適用場景:
一個對象結構包含多個類型的對象,希望對這些對象實施一些依賴其具體類型的操作。在訪問者中針對每一種具體的類型都提供了一個訪問操作,不同類型的對象可以有不同的訪問操作。 需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而需要避免讓這些操作“污染”這些對象的類,也不希望在增加新操作時修改這些類。訪問者模式使得我們可以將相關的訪問操作集中起來定義在訪問者類中,對象結構可以被多個不同的訪問者類所使用,將對象本身與對象的訪問操作分離。
對象結構中對象對應的類很少改變,但經常需要在此對象結構上定義新的操作。
優缺點:
優點:
擴展性
復用性
分離無關行為
缺點:
對象結構複雜
總結:
預留給回調實現