靜態(tài)企業(yè)網(wǎng)站模板目前最靠譜的推廣平臺
目錄
0、定義
1、訪問者模式的五種角色
2、訪問者模式的UML類圖
3、示例代碼
0、定義
??????? 表示一個作用于某對象結(jié)構(gòu)中的各個元素的操作。它可以在不改變各個元素的類的前提下,定義作用于這些元素的新操作。
1、訪問者模式的五種角色
- 抽象元素(Element):一個接口,該接口定義了接收訪問者的accept操作。
- 具體元素(Concrete Element):Element的實現(xiàn)類。
- 對象結(jié)構(gòu)(Object Structure):一個集合,用于存放Element對象,提供遍歷它自己的方法。
- 抽象訪問者(Visitor):一個接口,該接口定義操作對象(ConcreteElement的實例)的方法。
- 具體訪問者(Concrete Visitor):實現(xiàn)Visitor接口的類。
2、訪問者模式的UML類圖
3、示例代碼
抽象元素:
package xyz.jangle.design.visitor;public interface Element {public void accept(Visitor v);
}
具體元素A和B:
package xyz.jangle.design.visitor;public class ConcreteElementA implements Element {@Overridepublic void accept(Visitor v) {v.visit(this);}}
package xyz.jangle.design.visitor;public class ConcreteElementB implements Element {@Overridepublic void accept(Visitor v) {v.visit(this);}}
抽象訪問者:
package xyz.jangle.design.visitor;public interface Visitor {public void visit(ConcreteElementA a);public void visit(ConcreteElementB b);
}
具體訪問者1 和2 :
package xyz.jangle.design.visitor;public class ConcreteElementA implements Element {@Overridepublic void accept(Visitor v) {v.visit(this);}}
package xyz.jangle.design.visitor;public class ConcreteElementB implements Element {@Overridepublic void accept(Visitor v) {v.visit(this);}}
客戶端(使用):
package xyz.jangle.design.visitor;import java.util.ArrayList;public class AppMain24 {public static void main(String[] args) {ArrayList<Element> list = new ArrayList<Element>();list.add(new ConcreteElementA());list.add(new ConcreteElementA());list.add(new ConcreteElementA());list.add(new ConcreteElementB());list.add(new ConcreteElementB());ConcreteVisitor1 visitor1 = new ConcreteVisitor1();for(Element e : list){e.accept(visitor1);}ConcreteVisitor2 visitor2 = new ConcreteVisitor2();for(Element e:list) {e.accept(visitor2);}}}
輸出結(jié)果:
這是訪問者1的方法,可以訪問ConcreteElementA的屬性
這是訪問者1的方法,可以訪問ConcreteElementA的屬性
這是訪問者1的方法,可以訪問ConcreteElementA的屬性
這是訪問者1的方法,可以訪問ConcreteElementB的屬性
這是訪問者1的方法,可以訪問ConcreteElementB的屬性
這是訪問者2的方法,可以訪問ConcreteElementA的屬性
這是訪問者2的方法,可以訪問ConcreteElementA的屬性
這是訪問者2的方法,可以訪問ConcreteElementA的屬性
這是訪問者2的方法,可以訪問ConcreteElementB的屬性
這是訪問者2的方法,可以訪問ConcreteElementB的屬性