來源:《訪問者模式》java
定義:封裝一些做用於某種數據結構中的各元素的操做,能夠在不改變數據結構的前提下,定義做用於這些新元素的操做。web
訪問者角色:數據結構
Visitor抽象訪問者角色:聲明訪問者能夠訪問哪些對象。ide
ConcreteVisit具體訪問者:訪問者訪問一個對象,應該作什麼操做。this
Element 抽象元素:聲明接受哪類訪問者訪問。spa
ConcreteElement 具體元素:實現接受具體訪問者。code
類圖:對象
代碼:element
抽象元素it
/** * */ package cc.rico.pattern.visitor; /** * @author rico * 抽象元素 */ public interface Element { /** * */ public void option(); /** * 接收訪問者對象 * @param visitor */ public void accept(Visitor visitor); }
具體元素
/** * */ package cc.rico.pattern.visitor; /** * @author rico * 具體元素1 */ public class ConcreteElement1 implements Element { @Override public void option() { System.out.println("###ConcreteElement1.option..."); } @Override public void accept(Visitor visitor) { visitor.visit(this); } }
/** * */ package cc.rico.pattern.visitor; /** * @author rico * 具體元素1 */ public class ConcreteElement2 implements Element { @Override public void option() { System.out.println("###ConcreteElement2.option..."); } @Override public void accept(Visitor visitor) { visitor.visit(this); } }
抽象訪問者
package cc.rico.pattern.visitor; /** * @author rico * 抽象訪問者 */ public interface Visitor { /** * @param element */ public void visit(ConcreteElement1 element); /** * @param element */ public void visit(ConcreteElement2 element); }
具體訪問者
/** * */ package cc.rico.pattern.visitor; /** * @author rico * 具體訪問者 */ public class ConcreteVisitor implements Visitor { /* (non-Javadoc) * @see cc.rico.pattern.visitor.Visitor#visit(cc.rico.pattern.visitor.ConcreteElement1) */ @Override public void visit(ConcreteElement1 element) { element.option(); } /* (non-Javadoc) * @see cc.rico.pattern.visitor.Visitor#visit(cc.rico.pattern.visitor.ConcreteElement2) */ @Override public void visit(ConcreteElement2 element) { element.option(); } }
場景類
/** * */ package cc.rico.pattern.visitor; /** * @author rico * 場景類 */ public class Client { /** * @param args */ public static void main(String[] args) { Visitor visitor = new ConcreteVisitor(); Element element1 = new ConcreteElement1(); Element element2 = new ConcreteElement2(); element1.accept(visitor); element2.accept(visitor); } }
訪問者模式優勢:
符合單一原則,元素負責數據加載,訪問者負責具體的數據業務操做。
優秀的擴展性,能夠快捷的添加對元素數據的業務操做。
靈活性高。
訪問者模式缺點:
具體元素對訪問者公開細節。
具體元素變動困難。元素變動,訪問者也須要修改。
違背依賴倒置原則,訪問者依賴具體 元素,而不是抽象元素。
使用場景:
一個對象結構包含不少類對象,須要對這些對象實施依賴於具體類的操做。
須要對一個對象結構中的對象進行不一樣並且不相干的操做。
擴展: