23種設計模式(二)元件協作之模板方法
23種設計模式(三)元件協作之策略模式
23種設計模式(四)元件協作之觀察者模式
23種設計模式(五)單一職責之裝飾模式
23種設計模式(六)單一職責之橋模式
23種設計模式(七)物件建立之工廠方法
23種設計模式(八)物件建立之抽象工廠
23種設計模式(九)物件建立之原型模式
23種設計模式(十)物件建立之構建器
23種設計模式(十一)物件效能之單件模式
23種設計模式(十二)物件效能之享元模式
23種設計模式(十三)介面隔離之門面模式
23種設計模式(十四)介面隔離之**模式
23種設計模式(十五)介面隔離之介面卡
23種設計模式(十六)介面隔離之中介者
23種設計模式(十七)狀態變化之狀態模式
23種設計模式(十八)狀態變化之備忘錄
23種設計模式(十九)資料結構之組合模式
23種設計模式(二十)資料結構之迭代器
23種設計模式(二十一)資料結構之職責鏈
23種設計模式(二十二)行為變化之命令模式
23種設計模式(二十三)行為變化之訪問器
23種設計模式(二十四)領域規則之解析器
在軟體構建過程中,由於需求的改變,某些類層次結構中常常需要增加新的行為(方法),如果直接在基類中做這樣的更改,將會給子類帶來很繁重的變更負擔,甚至破壞原有設計。
如何在不更改類層次結構的前提下,在執行時根據需要透明地位類層次結構上的各個類動態新增新的操作,從而避免上述問題?
#include
using
namespace std;
class
visitor
;class
element};
class
elementa
:public element};
class
elementb
:public element};
class
visitor};
//******************************====
//擴充套件1
class
visitor1
:public visitor
void
visitelementb
(elementb& element) override};
//擴充套件2
class
visitor2
:public visitor
void
visitelementb
(elementb& element) override};
intmain()
#include
using
namespace std;
class
visitor
;class
element};
class
elementa
:public element
void
func2
(int data) override};
class
elementb
:public element
void
func2
(int data) override
};
表示乙個作用於某物件結構中的各元素的操作。使得可以在不改變(穩定)各元素的類的前提下定義(擴充套件)作用於這些元素的新操作(變化)。
visitor模式通過所謂雙重分發(double dispatch)來實現在不更改(不新增新的操作–編譯時),element類層次結構的前提下,在執行時透明地為類層次結構上的各個類動態新增新的操作(支援變化)。
所謂雙重分發即visitor模式中間包括了兩個多型分發(注意其中的多型機制):第乙個為accept方法的多型辨析;第二個為visitelementx方法的多型辨析。
visitor模式的最大缺點在於擴充套件類層次結構(增添新的element子類),會導致visitor類的改變。因此vistor模式適用於element類層次結構穩定,而其中的操作卻經常面臨頻繁改動的情況。
二十三種設計模式之行為型模式之模板方法
概述 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。templatemethod使得子類可以不改變乙個演算法的結構即可重定義該演算法的 某些特定步驟。適用性 1.一次性實現乙個演算法的不變的部分,並將可變的行為留給子類來實現。2.各子類中公共的行為應被提取出來並集中到乙個公共父類中以避免 ...
二十三種設計模式之組合模式
組合模式 將物件聚合成樹形結構來表現 整體 部分 的層次結構。組合模式能讓客戶以一致的方式來處理個別物件以及物件組合。也就是我們可以忽略物件組合與個體之間的差別。應用場景 餐廳合併列印主選單 子選單 public abstract class menucomponent public string ...
二十三種設計模式之工廠模式
工廠模式的核心 例項化物件 原因 有些物件不能直接例項化,比如介面 抽象類及複雜物件的其他依賴 核心 呼叫工廠class的靜態方法例項化物件 以日誌為例 public class staticfactory 核心 先建立工廠物件,之後呼叫工廠方法 例項化工廠模式 public class insta...