【設計模式】(二十八)--行爲型模式--訪問者模式

【設計模式】(二十八)–行爲型模式–訪問者模式

訪問者模式定義

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

結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章