大話設計模式之訪問者模式
阿新 • • 發佈:2018-12-18
訪問者模式: 表示一個 作用於 某物件結構中的各元素的操作,它可以是你在 不改變 各元素的類的前提下定義 作用於這些元素的新操作。 訪問模式適用於:資料結構相對穩定的系統。 他把資料結構和作用於結構上的操作直接的耦合解脫開,使得操作集合可以相對自由地 演化。 訪問者的目的是要把處理 從資料結構分離出來。 訪問者模式 得優點就是增加新得操作很容易,因為增加新得操作 就意味著增加 一個新得訪問者, 訪問者模式 將有關得行為集中到 一個訪問者物件中。同時,訪問者得缺點就是 使增加新得資料 結構變得困難了。(只有真的需要了才會用)
/** * 定義一個 Accept 操作,它以一個訪問者為引數 * */ abstract class Element { public abstract void Accept(Visitor visitor); }
/**
* 具體元素,實現Accept操作
* */
public class ConcreteElementA extends Element{
@Override
public void Accept(Visitor visitor) {
visitor.VisitConcreteElementA(this);
}
// 其他相關得方法
public void operationA() {}
}
/** * 具體元素,實現Accept操作 * */ public class ConcreteElementB extends Element{ @Override public void Accept(Visitor visitor) { visitor.VisitConcreteElementB(this); } // 其他得相關方法 public void operationB() {} }
/**
* 為該物件結構 種 ConcreteElement 的每一個類宣告一個Visit 操作。
* */
abstract class Visitor {
public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
}
/** * 具體訪問者,實現每個 有 Visitor 宣告得操作,每個操作實現演算法得一部分,而該演算法 片段 * 乃是 對 結構種物件得類 * **/ public class ConcreteVisitorA extends Visitor{ @Override public void VisitConcreteElementA(ConcreteElementA concreteElementA) { // TODO Auto-generated method stub System.out.println("beifangwenA"); } @Override public void VisitConcreteElementB(ConcreteElementB concreteElementB) { // TODO Auto-generated method stub System.out.println("beifangwenB"); } }
/**
* 具體訪問者,實現每個 有 Visitor 宣告得操作,每個操作實現演算法得一部分,而該演算法 片段
* 乃是 對 結構種物件得類
* **/
public class ConcreteVisitorB extends Visitor{
@Override
public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
// TODO Auto-generated method stub
System.out.println("beifangwenA");
}
@Override
public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
// TODO Auto-generated method stub
System.out.println("beifangwenB");
}
}
/**
* 能列舉它得元素。可以提供一個高層得介面允許訪問者訪問它得元素
* */
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ObjectStructure {
private List<Element> list=new ArrayList<>();
public void attach(Element element) {
list.add(element);
}
public void delete(Element element) {
list.remove(element);
}
public void accept(Visitor visitor) {
for (Element element : list) {
element.Accept(visitor);
}
}
}
/**
* 客戶端
* */
public class Test1 {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.attach(new ConcreteElementA());
objectStructure.attach(new ConcreteElementB());
ConcreteVisitorA concreteVisitorA = new ConcreteVisitorA();
ConcreteVisitorB concreteVisitorB = new ConcreteVisitorB();
objectStructure.accept(concreteVisitorB);
objectStructure.accept(concreteVisitorA);
}
}