C 桥接模式 - 开关和电器
橋接模式(Bridge Pattern)是將抽象部分與它的實現部分分離,使它們都可以獨立地變化。1
模式結構
UML 結構圖:
Abstraction(抽象類):用于定義抽象類的接口,并且維護一個指向 Implementor 實現類的指針。它與 Implementor 之間具有關聯關系。
RefinedAbstraction(擴充抽象類):擴充由 Abstraction 定義的接口,在 RefinedAbstraction 中可以調用在 Implementor 中定義的業務方法。
Implementor(實現類接口):定義實現類的接口,這個接口不一定要與 Abstraction 的接口完全一致,事實上這兩個接口可以完全不同。
ConcreteImplementor(具體實現類):實現了 Implementor 定義的接口,在不同的 ConcreteImplementor 中提供基本操作的不同實現。在程序運行時,ConcreteImplementor 對象將替換其父類對象,提供給 Abstraction 具體的業務操作方法。
案例分析
對于開關和電器來說,不管任何時候,都可以在不觸及另一方的情況下進行更換。比如,可以在不更換開關的情況下換掉燈泡(或風扇),也可以在不接觸燈泡(或風扇)的情況下更換掉開關,甚至可以在不接觸開關的情況下將燈泡和風扇互換。
這看起來很自然,當然也應該是這樣!當不同的事物聯系到一起時,它們應該在一個可以變更或者替換的系統中,以便不相互影響或者使影響盡可能的小,這樣才能更方便、更低成本地去管理系統。試想一下,如果要更換房間里的一個燈泡,還必須把開關也換了,你會考慮使用這樣的系統嗎?
代碼實現
創建實現類接口
所有電器都有一些共性,可以被打開和關閉:
//?implementor.h #ifndef?IMPLEMENTOR_H #define?IMPLEMENTOR_H//?電器 class?IEquipment { public:virtual?~IEquipment()?{}//?打開virtual?void?PowerOn()?=?0;//?關閉virtual?void?PowerOff()?=?0; };#endif?//?IMPLEMENTOR_H創建具體實現類
接下來,是真正的電器 - 電燈和風扇,它們實現了 IEquipment 接口:
//?concrete_implementor.h #ifndef?CONCRETE_IMPLEMENTOR_H #define?CONCRETE_IMPLEMENTOR_H#include?"implementor.h" #include?//?電燈 class?Light?:?public?IEquipment { public://?開燈void?PowerOn()?override?{std::cout?<<?"Light?is?on."?<<?std::endl;}//?關燈void?PowerOff()?override?{std::cout?<<?"Light?is?off."?<<?std::endl;} };//?風扇 class?Fan?:?public?IEquipment { public://?打開風扇void?PowerOn()?override?{std::cout?<<?"Fan?is?on."?<<?std::endl;}//?關閉風扇void?PowerOff()?override?{std::cout?<<?"Fan?is?off."?<<?std::endl;} };#endif?//?CONCRETE_IMPLEMENTOR_H創建客戶端
很好,是時候將開關和電器關聯起來了:
//?main.cpp #include?"refined_abstraction.h" #include?"concrete_implementor.h"#ifndef?SAFE_DELETE #define?SAFE_DELETE(p)?{?if(p){delete?p;?p=nullptr;}?} #endifint?main() {//?創建電器?-?電燈、風扇IEquipment?*light?=?new?Light();IEquipment?*fan?=?new?Fan();/***?創建開關?-?拉鏈式開關、兩位開關*?將拉鏈式開關和電燈關聯起來,將兩位開關和風扇關聯起來**/ISwitch?*pullChain?=?new?PullChainSwitch(light);ISwitch?*twoPosition?=?new?TwoPositionSwitch(fan);//?開燈、關燈pullChain->On();pullChain->Off();//?打開風扇、關閉風扇twoPosition->On();twoPosition->Off();SAFE_DELETE(twoPosition);SAFE_DELETE(pullChain);SAFE_DELETE(fan);SAFE_DELETE(light);getchar();return?0; }輸出如下:
Switch on the equipment with a pull chain switch.
Light is on.
Switch off the equipment with a pull chain switch.
Light is off.
Switch on the equipment with a two-position switch.
Fan is on.
Switch off the equipment with a two-position switch.
Fan is off.
聲明:
本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。
總結
以上是生活随笔為你收集整理的C 桥接模式 - 开关和电器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果 iPhone 15 Pro Max
- 下一篇: 开启这个功能,你的 iPhone永远都不