【設計模式】(二十八)–行爲型模式–訪問者模式
訪問者模式定義
Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.
意思是:封裝一些作用於某個數據結構中的各元素的操作,它可以在不改變數據結構的前提下定義作用於這些元素的新操作。
訪問者模式基於以下四個元素:
- Visitor 抽象訪問者,聲明瞭每個Concrete Element相應的方法。方法的名稱相同,但是每個方法都按照其接受的類型區分。
- Concrete Visitor 具體訪問者,實現抽象訪問者角色中的各個訪問操作。當需要一組單獨的操作時,只需要創建另一個訪問者。
- Element 元素,表示對象結構的基類。結構中所有類都是它的派生,都必須實現accept(Visitor visitor)
- Concrete Element 具體元素,可能有多種具體元素,是想要添加在Visitor類中實現的外部操作的具體類。
訪問者模式的優點
- 1、符合單一職責原則。
- 2、優秀的擴展性。
- 3、靈活性。
但是訪問者模式也有以下缺點 - 1、具體元素對訪問者公佈細節,違反了迪米特原則。
- 2、具體元素變更比較困難。 只要變更,所有訪問者都需要變更。
- 3、違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。
訪問者模式的使用場景
- 1、對象結構中對象對應的類很少改變,但經常需要在此對象結構上定義新的操作。
- 2、需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而需要避免讓這些操作"污染"這些對象的類,也不希望在增加新操作時修改這些類。
訪問者模式的簡單實現
類圖
實現
public class Test {
public static void main(String[] args) {
Computer computer = new Computer();
computer.accept(new ComputerDisplayVisitor());
}
}
public class Computer {
private Hardware keyboard;
private Hardware mouse;
public Computer() {
this.keyboard = new Keyboard("機械鍵盤", "KeyTronic");
this.mouse = new Mouse("藍牙鼠標", "邏輯");
}
public void accept(ComputerVisitor computerVisitor) {
keyboard.accept(computerVisitor);
mouse.accept(computerVisitor);
}
}
public interface ComputerVisitor {
void visit(Hardware hardware);
}
public class ComputerDisplayVisitor implements ComputerVisitor {
@Override
public void visit(Hardware hardware) {
System.out.println("顯示硬件信息:" + hardware.getInfo());
}
}
public abstract class Hardware {
private String name;
private String brand;
public Hardware(String name, String brand) {
this.name = name;
this.brand = brand;
}
public String getInfo() {
return brand + name;
}
abstract void accept(ComputerVisitor computerVisitor);
}
public class Keyboard extends Hardware {
public Keyboard(String name, String brand) {
super(name, brand);
}
@Override
public void accept(ComputerVisitor computerVisitor) {
computerVisitor.visit(this);
}
}
public class Mouse extends Hardware {
public Mouse(String name, String brand) {
super(name, brand);
}
@Override
public void accept(ComputerVisitor computerVisitor) {
computerVisitor.visit(this);
}
}
結果