Visitor模式:
提供一個做用於某對象結構中的各元素的操做表示,它使咱們能夠在不改變各元素的類的前提下定義做用於這些元素的新操做。
訪問者模式是一種將算法與對象結構分離的軟件設計模式。訪問者模式是一種對象行爲型模式。java
結構圖:
算法
示例類圖:
設計模式
示例代碼:markdown
// Visitor
public interface ComputerPartVisitor {
public void visit(Computer computer);
public void visit(Mouse mouse);
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
// ConcreteVisitor
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
@Override
public void visit(Computer computer) {
System.out.println("Displaying " + computer.getPart());
}
@Override
public void visit(Mouse mouse) {
System.out.println("Displaying " + mouse.getPart());
}
@Override
public void visit(Keyboard keyboard) {
System.out.println("Displaying " + keyboard.getPart());
}
@Override
public void visit(Monitor monitor) {
System.out.println("Displaying " + monitor.getPart());
}
}
// Element
public abstract class ComputerPart {
protected String part;
public ComputerPart(String part) {
this.part = part;
}
public abstract void accept(ComputerPartVisitor computerPartVisitor);
public String getPart() {
return part;
}
}
// ConcreteElement
public class Keyboard extends ComputerPart {
public Keyboard(String part) {
super(part);
}
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
public class Monitor extends ComputerPart {
public Monitor(String part) {
super(part);
}
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
public class Mouse extends ComputerPart {
public Mouse(String part) {
super(part);
}
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
// ObjectStructure
public class Computer extends ComputerPart {
private ComputerPart[] parts;
public Computer(String part) {
super(part);
this.parts = new ComputerPart[] { new Mouse("Mouse"), new Keyboard("Keyboard"), new Monitor("Monitor") };
}
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
for (int i = 0; i < parts.length; i++) {
parts[i].accept(computerPartVisitor);
}
computerPartVisitor.visit(this);
}
}
// 測試
public class VisitorTest {
public static void main(String[] args) {
ComputerPart computer = new Computer("Computer");
ComputerPartVisitor visitor = new ComputerPartDisplayVisitor();
computer.accept(visitor);
}
}
角色:ide
Vistor(抽象訪問者):
抽象訪問者爲對象結構中每個具體元素類ConcreteElement聲明一個訪問操做,
從這個操做的名稱或參數類型能夠清楚知道須要訪問的具體元素的類型,具體訪問者須要實現這些操做方法,定義對這些元素的訪問操做。測試
ConcreteVisitor(具體訪問者):
具體訪問者實現了每一個由抽象訪問者聲明的操做,每個操做用於訪問對象結構中一種類型的元素。this
Element(抽象元素):
抽象元素通常是抽象類或者接口,它定義一個accept()方法,該方法一般以一個抽象訪問者做爲參數。spa
ConcreteElement(具體元素):
具體元素實現了accept()方法,在accept()方法中調用訪問者的訪問方法以便完成對一個元素的操做。設計
ObjectStructure(對象結構):
對象結構是一個元素的集合,它用於存放元素對象,而且提供了遍歷其內部元素的方法。它能夠結合組合模式來實現,
也能夠是一個簡單的集合對象,如一個List對象或一個Set對象。code
缺點:
增長新的元素類很困難,在訪問者模式中,每增長一個新的元素類都意味着要在抽象訪問者角色中增長一個新的抽象操做,
並在每個具體訪問者類中增長相應的具體操做,違背了「開閉原則」的要求。
破壞封裝,當採用訪問者模式的時候,就會打破組合類的封裝。