訪問(wèn)者模式

1. 概念

表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作,它使我們可以在不改變?cè)氐念惖那疤嵯露x作用于這些元素的新操作。

2. 適用場(chǎng)景

對(duì)于存儲(chǔ)在一個(gè)集合中的對(duì)象,它們可能具有不同的類型(即使有一個(gè)公共的接口),對(duì)于該集合中的對(duì)象,可以接受一類稱為訪問(wèn)者的對(duì)象來(lái)訪問(wèn),不同的訪問(wèn)者其訪問(wèn)的方式也有所不同。

工作中很少適用到

3. 代碼分析

屏幕快照 2021-01-20 下午2.32.50.png

故事原型是這樣的:在中關(guān)村攢電腦,假如組裝一臺(tái)電腦所需的部件有{cpu, 內(nèi)存, 主板}三部分組成,而針對(duì)不同的團(tuán)體時(shí),電腦的不同的零部件優(yōu)惠力度有所不同。

  • ComputerPart - 電腦的各部件抽象:
abstract class ComputerPart {
    // 每個(gè)部件接收來(lái)訪者
    abstract void accept(Visitor v);
    // 各部件的定價(jià)
    abstract double getPrice();
}
  • Visitor - 各階層的訪問(wèn)者,對(duì)各部件的不同操作抽象:
interface Visitor {
    void visitCpu(CPU cpu);
    void visitMemory(Memory memory);
    void visitBoard(Board board);
}
  • CPU/Memory/Board - 各部件:
class CPU extends ComputerPart {
    @Override
    void accept(Visitor v) {
        v.visitCpu(this);
    }
    @Override
    double getPrice() {
        return 500;
    }
}
class Memory extends ComputerPart {
    @Override
    void accept(Visitor v) {
        v.visitMemory(this);
    }
    @Override
    double getPrice() {
        return 300;
    }
}
class Board extends ComputerPart {
    @Override
    void accept(Visitor v) {
        v.visitBoard(this);
    }
    @Override
    double getPrice() {
        return 200;
    }
}
  • PersonelVisitor - 個(gè)人訪問(wèn)者對(duì)各部件的操作:
class PersonelVisitor implements Visitor {
    double totalPrice = 0.0;
    @Override
    public void visitCpu(CPU cpu) {
        totalPrice += cpu.getPrice()*0.9;
    }
    @Override
    public void visitMemory(Memory memory) {
        totalPrice += memory.getPrice()*0.85;
    }
    @Override
    public void visitBoard(Board board) {
        totalPrice += board.getPrice()*0.95;
    }
}
  • Computer - 成品電腦:
public class Computer {
    ComputerPart cpu = new CPU();
    ComputerPart memory = new Memory();
    ComputerPart board = new Board();
    public void acccept(Visitor v) {
        this.cpu.accept(v);
        this.memory.accept(v);
        this.board.accept(v);
    }
}
  • 場(chǎng)景:
public static void main(String[] args) {
        PersonelVisitor p = new PersonelVisitor();
        new Computer().acccept(p);
        System.out.println(p.totalPrice);
    }

代碼分析:使用訪問(wèn)模式組織代碼后,避免了各部件中根據(jù)不同的團(tuán)體if else的判斷,來(lái)區(qū)分不同的優(yōu)惠力度。而是通過(guò)實(shí)現(xiàn)Visitor接口,從而將不同階層的人員對(duì)各部件的操作抽取出來(lái)。Computer與實(shí)現(xiàn)各ComputerPart的類結(jié)構(gòu)就固定下來(lái)。
如果子結(jié)構(gòu)(部件)的數(shù)量不確定,那么此模式不適合。

4. 總結(jié)

  1. 此模式適合子結(jié)構(gòu)數(shù)量確定的情況
  2. 主要用于編譯器的設(shè)計(jì)

————————————————————
坐標(biāo)帝都,白天上班族,晚上是知識(shí)的分享者
如果讀完覺(jué)得有收獲的話,歡迎點(diǎn)贊加關(guān)注

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容