Visitor訪問者設計模式是在不修改已有程序結構的前提下,經過添加額外的「訪問者」來完成對已有代碼功能的提高。 java
Visitor訪問者設計模式的角色:
(1) 訪問者角色(Visitor):聲明一個訪問接口。接口的名稱和方法的參數標識了向訪問者發送請求的元素角色。這樣訪問者就能夠經過該元素角色的特定接口直接訪問它。
(2) 具體訪問者角色(Concrete Visitor):實現訪問者角色(Visitor)接口 設計模式
(3)元素角色(Element):定義一個Accept操做,它以一個訪問者爲參數。
(4) 具體元素角色(Concrete Element):實現元素角色(Element)接口。
(5) 對象結構角色(Object Structure):具體元素的集合,提供一個高層的接口容許訪問者角色訪問它的元素。 this
Visitor訪問者設計模式結構以下: spa
Visitor訪問者設計模式例子代碼以下: 設計
//抽象元素 interface IElement{ public void accept(IVisitor visitor); } //具體元素 class ElementA implements IElement{ public void accept(IVisitor visitor){ visitor.visit(this); } public void operationA(){ System.out.println(「ElementA do operationA()……」); } } class ElementB implements IElement{ public void accept(IVisitor visitor){ visitor.visit(this); } public void operationB(){ System.out.println(「ElementB do operationB()……」); } } class ElementC implements IElement{ public void accept(IVisitor visitor){ visitor.visit(this); } public void operationC(){ System.out.println(「ElementC do operationC()……」); } } //抽象訪問者 interface IVisitor{ public void visit(ElementA element); public void visit(ElementB element); public void visit(ElementC element); } //具體訪問者 class MyVisitor implements IVisitor{ public void visit(ElementA element){ element.operationA(); } public void visit(ElementB element){ element.operationB(); } public void visit(ElementC element){ element.operationC(); } } Public class VisitorDemo{ public static void main(String[] args){ IElement[] list = {new ElementA(), new ElementB(), new ElementC()}; IVisitor visitor = new MyVisitor(); for(int i = 0; i < list.length; i++){ list[i].accept(visitor); } } }
Visitor訪問者設計模式有如下兩個特色: code
(1).對元素的訪問不是訪問者主動發起的,而是經過元素接收訪問者來訪問本身。 對象
(2).對元素的操做不是元素本身主動調用,而是經過訪問者的訪問方法來操做元素。 接口
JDK中訪問者模式的應用: element