在訪問者模式(Visitor Pattern)中,我們使用了一個訪問者類,它改變了元素類的執(zhí)行算法。
通過這種方式,元素的執(zhí)行算法可以隨著訪問者改變而改變。
這種類型的設(shè)計模式屬于行為型模式。根據(jù)模式,元素對象已接受訪問者對象,這樣訪問者對象就可以處理元素對象上的操作。
訪問者模式的核心組成部分包括:
抽象元素(Element):定義了一個接受訪問者對象的方法,即accept()方法,用于調(diào)用訪問者的操作。
具體元素(Concrete Element):實現(xiàn)了抽象元素接口,并實現(xiàn)了accept()方法,根據(jù)元素對象的類型選擇相應(yīng)的操作。
抽象訪問者(Visitor):定義了訪問者對象的接口,包含了對不同元素對象進(jìn)行訪問的方法。
具體訪問者(Concrete Visitor):實現(xiàn)了抽象訪問者接口,具體定義了對不同元素對象的訪問操作。
訪問者模式的主要優(yōu)點包括:
增加新的操作非常方便:通過增加新的具體訪問者類,可以非常方便地增加新的操作或算法,而無需修改現(xiàn)有的元素類。
將有關(guān)的行為集中到一個訪問者中:通過將相似的操作集中到同一個訪問者中,可以使得代碼更加清晰、模塊化和可維護(hù)。
良好的擴(kuò)展性:在增加新的元素類時,只需要實現(xiàn)元素的接受訪問者方法和具體訪問者的相應(yīng)操作,不需要修改其他類。
缺點:
1、具體元素對訪問者公布細(xì)節(jié),違反了迪米特原則。 2、具體元素變更比較困難。 3、違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。
文章來源:http://www.zghlxwxcb.cn/news/detail-627292.html
//5.對象結(jié)構(gòu)(Object Structure)角色:是一個包含元素角色的容器,提供讓訪問者對象遍歷容器中的所有元素的方法,
// 通常由 List、Set、Map 等聚合類實現(xiàn)。
public class Computer implements ComputerPart {
//組合模式:也可以用迭代器替換
ComputerPart[] parts;
public Computer(){
parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
}
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
for (int i = 0; i < parts.length; i++) {
parts[i].accept(computerPartVisitor);
}
computerPartVisitor.visit(this);
}
}
// 組合模式+訪問者模式
/*
* 抽象元素(Element)角色: 聲明一個包含接受操作 accept() 的接口,被接受的訪問者對象作為 accept() 方法的參數(shù)。
*/
public interface ComputerPart {
//要用 computerPartVisitor 對象來對當(dāng)前的元素進(jìn)行處理
//ComputerPartVisitor是一個接口,有處理元素的方法.
public void accept(ComputerPartVisitor computerPartVisitor);
}
//抽象訪問者(Visitor)角色:定義一個訪問具體元素的接口,
// 為每個具體元素類對應(yīng)一個訪問操作 visit() ,該操作中的參數(shù)類型標(biāo)識了被訪問的具體元素。
public interface ComputerPartVisitor {
//訪問者 處理每個具體的元素。
public void visit(Computer computer);
public void visit(Mouse mouse);
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
//具體訪問者(ConcreteVisitor)角色:實現(xiàn)抽象訪問者角色中聲明的各個訪問操作,確定訪問者訪問一個元素時該做什么
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
@Override
public void visit(Computer computer) {
//TODO:具體的處理。。。
System.out.println("Displaying Computer.");
}
@Override
public void visit(Mouse mouse) {
//可以從mouse中取出具體對象的數(shù)據(jù),進(jìn)行相應(yīng)的處理了.
System.out.println("Displaying Mouse.");
}
@Override
public void visit(Keyboard keyboard) {
System.out.println("Displaying Keyboard.");
}
@Override
public void visit(Monitor monitor) {
System.out.println("Displaying Monitor.");
}
}
//4.具體元素(ConcreteElement)角色:實現(xiàn)抽象元素角色提供的 accept() 操作,其方法體通常都是 visitor.visit(this) ,另外具體元素中可能還包含本身業(yè)務(wù)邏輯的相關(guān)操作。
public class Keyboard implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
public class Monitor implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
//具體的元素類:包裝數(shù)據(jù)
public class Mouse implements ComputerPart {
//TODO:這里是每個類具體的數(shù)據(jù)
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this); //處理功能分開, 包裝功能
}
}
public class VisitorPatternDemo {
public static void main(String[] args) {
ComputerPart computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
}
}
行文至此,關(guān)于二十三篇設(shè)計模式終于算是完結(jié)了,可能以后的日子我會將這二十三篇博客進(jìn)行進(jìn)一步的細(xì)化和歸納總結(jié),也或許就這樣了,這個得看我將來是否繼續(xù)抽時候在此,或者是否在將來繼續(xù)從事這個行業(yè)了,有了一定的經(jīng)驗,那么我將繼續(xù)在此二十三篇設(shè)計模式上繼續(xù)拓展和填寫一些坑。
還是那句話,學(xué)無止境,編程這條路,一直學(xué)一直學(xué),但是必須得專攻一個方向?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-627292.html
到了這里,關(guān)于二十三種設(shè)計模式第二十四篇--訪問者模式(完結(jié)撒花)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!