我是做裝修的怎么樣投資網(wǎng)站個人網(wǎng)站規(guī)劃書模板
目錄
- 二、訪問者模式
- 概念
- 代碼
- 類圖
- 實例一:名牌運動鞋專賣店銷售軟件
- 實例二:計算機部件銷售軟
- 優(yōu)缺點
- 適用場合
- 課程作業(yè)
二、訪問者模式
概念
- 對于系統(tǒng)中的某些對象,它們存儲在同一個集合中,具有不同的類型
- 對于該集合中的對象,可以接受一類被稱為訪問者的對象來訪問
- 不同的訪問者其訪問方式有所不同
目的:
封裝一些施加于某種數(shù)據(jù)結構元素之上的操作,一旦這些操作需要修改的話,接受這個操作的數(shù)據(jù)結構可以保持不變
模式動機:
為不同類型的元素提供多種訪問操作方式,且可以在不修改原有系統(tǒng)的情況下增加新的操作方式
缺點:將所有的稅率運算分布到不同的結點類使得系統(tǒng)不容易理解、維護與改變。
如果要增加一個新的功能,則要在很多結點類都寫入新的代碼,且要重新編譯所有的類。
當稅率變化時要修改每個結點上的calculateTax()代碼。
因此,該設計的可擴展性和可維護性都不好。
解決方案:分離“Tax”類及其“calculateTax()”功能。
將所有結點的稅額計算方法都從原來的類中分離出來,放入另外一個獨立的類,叫做“TaxCalculation”類,設計圖如下。
設計思想:將原來分布于各結點中的計算稅額的方法都放在一個TaxCalculation類中。當要計算某個結點的稅額時,則調(diào)用TaxCalculation中某個相應的方法進行計算。
代碼
訪問者模式(Visitor Pattern)是一種行為型設計模式,用于在不改變被訪問對象的結構的情況下,定義對其元素的新操作。訪問者模式將數(shù)據(jù)結構和對數(shù)據(jù)的操作分離開來,使得操作可以獨立變化而不影響數(shù)據(jù)結構。
在訪問者模式中,有以下幾個角色:
-
訪問者(Visitor):定義了對不同元素的訪問操作,每個具體訪問者都實現(xiàn)了對應的訪問方法,用于處理特定類型的元素。
-
具體訪問者(Concrete Visitor):實現(xiàn)了訪問者定義的訪問方法,具體處理不同類型元素的操作。
-
元素(Element):定義了接受訪問者訪問的接口,可以是抽象類或接口。
-
具體元素(Concrete Element):實現(xiàn)了元素定義的接口,具體元素可以有不同的類型,每個具體元素都可以接受訪問者的訪問。
-
對象結構(Object Structure):包含元素的集合,可以是一個容器,也可以是一個復雜的數(shù)據(jù)結構。
下面是一個簡單的訪問者模式的示例代碼,以展示其使用方式和實現(xiàn)原理:
// 定義元素接口
interface Element {void accept(Visitor visitor);
}// 具體元素A
class ConcreteElementA implements Element {public void accept(Visitor visitor) {visitor.visitConcreteElementA(this);}public String operationA() {return "具體元素A的操作";}
}// 具體元素B
class ConcreteElementB implements Element {public void accept(Visitor visitor) {visitor.visitConcreteElementB(this);}public String operationB() {return "具體元素B的操作";}
}// 定義訪問者接口
interface Visitor {void visitConcreteElementA(ConcreteElementA element);void visitConcreteElementB(ConcreteElementB element);
}// 具體訪問者
class ConcreteVisitor implements Visitor {public void visitConcreteElementA(ConcreteElementA element) {System.out.println("訪問者對" + element.operationA() + "的操作");}public void visitConcreteElementB(ConcreteElementB element) {System.out.println("訪問者對" + element.operationB() + "的操作");}
}// 對象結構
class ObjectStructure {private List<Element> elements = new ArrayList<>();public void addElement(Element element) {elements.add(element);}public void removeElement(Element element) {elements.remove(element);}public void accept(Visitor visitor) {for (Element element : elements) {element.accept(visitor);}}
}// 示例代碼的使用
public class VisitorPatternExample {public static void main(String[] args) {// 創(chuàng)建對象結構ObjectStructure objectStructure = new ObjectStructure();// 添加具體元素A和BobjectStructure.addElement(new ConcreteElementA());objectStructure.addElement(new ConcreteElementB());// 創(chuàng)建具體訪問者Visitor visitor = new ConcreteVisitor();// 對對象結構中的元素進行訪問操作objectStructure.accept(visitor);}
}
在上述示例代碼中,訪問者模式的核心在于訪問者(Visitor)和元素(Element)的交互。具體的訪問者定義了訪問不同元素的方法,而具體元素實現(xiàn)了接受訪問者訪問的接口。通過對象結構將元素組織起來,并調(diào)用訪問者的訪問方法,實現(xiàn)對元素的訪問操作。
訪問者模式的優(yōu)點包括:
- 將數(shù)據(jù)結構和操作解耦,使得新增訪問操作變得容易。
- 可以對元素的操作進行擴展,而不需要修改元素的結構。
- 符合開閉原則,增加新的訪問者只需要新增具體訪問者,而不需要修改其他代碼。
然而,訪問者模式也有一些限制和注意事項:
- 增加新的元素可能會導致訪問者接口的修改,從而需要修改所有的具體訪問者。
- 對象結構中的元素類型較多時,會導致具體訪問者的訪問方法過多,增加了維護的復雜性。
- 訪問者模式適用于數(shù)據(jù)結構相對穩(wěn)定,但經(jīng)常需要新增操作的場景,對于數(shù)據(jù)結構變化頻繁的場景,使用訪問者模式可能不合適。
總而言之,訪問者模式提供了一種靈活的方式來對數(shù)據(jù)結構的元素進行新的操作,同時也將訪問邏輯與元素的結構解耦,使得系統(tǒng)更加靈活、可擴展和易于維護。
類圖
訪問者模式:表示一個作用于某對象結構中的個元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
訪問者模式是一種對象行為型模式
首先分為兩個部分,一是元素類,而是訪問者類
先抽象再具體
在訪問者類里要有訪問元素的方法visitXXX(抽象元素父類做參數(shù))之類的
在元素類里要有接受訪問的方法,比如accept(抽象訪問者父類做參數(shù))等
實例一:名牌運動鞋專賣店銷售軟件
在客戶程序中將直接創(chuàng)建運動鞋子類與訪問者子類的對象,然后直接調(diào)用運動鞋子類的 accept 方法。根據(jù)用戶輸入的所購買鞋的數(shù)量和單價來計算總價和獲得相應特點的功能分別由 Visitor 類的兩個子類 PriceVisitor 和 ShoeInfoVisitor 來實現(xiàn)。訪問者類圖如下。
實例二:計算機部件銷售軟
優(yōu)缺點
優(yōu)點:
- 使得增加新的訪問操作變得很容易。
- 將有關元素對象的訪問行為集中到一個訪問者對象中,而不是分散到一個個的元素類中。
- 可以跨過類的等級結構訪問屬于不同的等級結構的元素類。
- 讓用戶能夠在不修改現(xiàn)有類層次結構的情況下,定義該類層次結構的操作。
缺點:
- 增加新的元素類很困難,違背了“開閉原則”的要求。
- 破壞封裝。訪問者模式要求訪問者對象訪問并調(diào)用每一個元素對象的操作,這意味著元素對象有時候必須暴露一些自己的內(nèi)部操作和內(nèi)部狀態(tài),否則無法供訪問者訪問。
適用場合
對象結構中對象對應的類很少改變,但經(jīng)常需要在此對象結構上定義新的操作
課程作業(yè)