1. 程式人生 > >大話設計模式之訪問者模式

大話設計模式之訪問者模式

訪問者模式: 表示一個 作用於 某物件結構中的各元素的操作,它可以是你在 不改變 各元素的類的前提下定義 作用於這些元素的新操作。 訪問模式適用於:資料結構相對穩定的系統。 他把資料結構和作用於結構上的操作直接的耦合解脫開,使得操作集合可以相對自由地 演化。 訪問者的目的是要把處理 從資料結構分離出來。 訪問者模式 得優點就是增加新得操作很容易,因為增加新得操作 就意味著增加 一個新得訪問者, 訪問者模式 將有關得行為集中到 一個訪問者物件中。同時,訪問者得缺點就是 使增加新得資料 結構變得困難了。(只有真的需要了才會用)

/**
 * 定義一個 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);
}

}