設計模式-訪問者模式

來源:《訪問者模式》java

定義:封裝一些做用於某種數據結構中的各元素的操做,能夠在不改變數據結構的前提下,定義做用於這些新元素的操做。web

訪問者角色:數據結構

  1. Visitor抽象訪問者角色:聲明訪問者能夠訪問哪些對象。ide

  2. ConcreteVisit具體訪問者:訪問者訪問一個對象,應該作什麼操做。this

  3. Element 抽象元素:聲明接受哪類訪問者訪問。spa

  4. 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);
	}
}


訪問者模式優勢:

  1. 符合單一原則,元素負責數據加載,訪問者負責具體的數據業務操做。

  2. 優秀的擴展性,能夠快捷的添加對元素數據的業務操做。

  3. 靈活性高。

訪問者模式缺點:

  1. 具體元素對訪問者公開細節。

  2. 具體元素變動困難。元素變動,訪問者也須要修改。

  3. 違背依賴倒置原則,訪問者依賴具體 元素,而不是抽象元素。

使用場景:

  1. 一個對象結構包含不少類對象,須要對這些對象實施依賴於具體類的操做。

  2. 須要對一個對象結構中的對象進行不一樣並且不相干的操做。

擴展:

相關文章
相關標籤/搜索