设计模式的理解:桥模式 Bridge
? ? ? ? ?當(dāng)一種抽象有多種實(shí)現(xiàn)時(shí)通常用繼承來實(shí)現(xiàn)他們。橋模式的設(shè)計(jì)和裝飾模式 有一定的相似之處,都是通過組合來解決繼承的濫用問題。現(xiàn)有一個(gè)需求,將一個(gè)項(xiàng)目分成普通用戶版和VIP版,該項(xiàng)目要同時(shí)支持WINDOW10 和手機(jī)版本。VIP版在當(dāng)?shù)卿?#xff0c;發(fā)送消息時(shí)會(huì)有鈴聲提示和播放些動(dòng)畫,而普通用戶版沒有。基礎(chǔ)功能抽象類如下:
class Base {public:virtual void login(string userid,string password)=0;virtual void sendMessage(string message)=0;virtual void playSound()=0;virtual void playAnimation()=0; }在上述抽象類的設(shè)計(jì)中,由于 Windows10 和 手機(jī)版本的接口不一樣,繼承Base 類需要實(shí)現(xiàn) playSound 和 playAnimation。而vip版和用戶版是功能的擴(kuò)展需實(shí)現(xiàn)login和sendMessage
class Base {public:virtual void login(string userid,string password)=0;virtual void sendMessage(string message)=0;virtual void playSound()=0;virtual void playAnimation()=0; };class Windows10Base : public Base{public :virtual void playSound(){//電腦版播放聲音}virtual void playAnimation(){//電腦版播放動(dòng)畫}virtual void login(string userid,string pwd){// login()}virtual void sendMessage(string userid,string pwd){// sendMessage()} }; class MobileBase : public Base{public :virtual void playSound(){//手機(jī)版播放聲音}virtual void playAnimation(){//手機(jī)版播放動(dòng)畫}virtual void login(string userid,string pwd){// login()}virtual void sendMessage(string userid,string pwd){// sendMessage()} };class Windows10VIP : public Windows10Base {public :virtual void login(string userid,string pwd){Windows10Base::playSound();Windows10Base::playAnimation();// login()}virtual void sendMessage(string userid,string pwd){Windows10Base::playSound();Windows10Base::playAnimation();// sendMessage()} }; class MobileVIP : public MobileBase {public :virtual void login(string userid,string pwd){MobileBase ::playSound();MobileBase ::playAnimation();// login()}virtual void sendMessage(string userid,string pwd){MobileBase ::playSound();MobileBase ::playAnimation();// sendMessage()} };此設(shè)計(jì)方式是不利于擴(kuò)展的,當(dāng)前情況是支持兩個(gè)系統(tǒng)的功能,用戶等級分為兩個(gè)就要有 4個(gè)派生類。假如業(yè)務(wù)將Vip等級進(jìn)行細(xì)化,細(xì)化成 VIP1,VIP2,VIP3 等,那么每個(gè)等級不得同時(shí)去繼承不同系統(tǒng)的類嗎。假如需要支持Window 7 ,Window10,手機(jī)等 n 個(gè)不同的系統(tǒng),業(yè)務(wù)要求用戶等級需細(xì)分成 m 個(gè)不同的等級,按照上述的方法就會(huì)建立? m* n 個(gè)派生類。
如果應(yīng)用橋模式,那么只需要新建 m+ n 個(gè)派生類,當(dāng)進(jìn)行系統(tǒng)擴(kuò)展時(shí)只需要新增1個(gè)類,當(dāng)VIP等級進(jìn)行擴(kuò)展時(shí),也只需要新增1個(gè)類就行。
橋模式,將抽象部分與它的實(shí)現(xiàn)部分分離。反應(yīng)出來的設(shè)計(jì)思想是,當(dāng)抽象類中的純虛函數(shù)應(yīng)按照不同維度進(jìn)行分離,分別繼承,通過內(nèi)成員指針將不同維度的方法關(guān)聯(lián)在一起。換句話說,上述的需求分成 “可支持的系統(tǒng)”維度 和 “VIP等級” 維度。這兩個(gè)不同維度中需實(shí)現(xiàn)的方法不一致時(shí)就不應(yīng)該將這些抽象方法放一起。
class SystemBase {public :virtual void playSound()=0;virtual void playAnimation()=0; }; class UserLevelBase {SystemBase * systemBase;public :UserLevelBase (s):systemBase(s){}virtual void login(string userid,string pwd)=0;virtual void sendMessage(string userid,string pwd)=0; };class NormalLevel :public UserLevelBase {public :NormalLevel (SystemBase *s):UserLevelBase (s){}virtual void login(string userid,string pwd){// login()}virtual void sendMessage(string userid,string pwd){// sendMessage()} }; class VIPLevelfirst : public UserLevelBase {public :VIPLevelfirst (SystemBase *s):UserLevelBase (s){}virtual void login(string userid,string pwd){systemBase->playSound();systemBase->playAnimation();// login()}virtual void sendMessage(string userid,string pwd){systemBase->playSound();systemBase->playAnimation();// sendMessage()} }; class MobileBase : public SystemBase{public :virtual void playSound(){//手機(jī)版播放聲音}virtual void playAnimation(){//手機(jī)版播放動(dòng)畫} }; class Windows10Base : public SystemBase{public :virtual void playSound(){//電腦版播放聲音}virtual void playAnimation(){//電腦版播放動(dòng)畫} };//---------------------------------------- void main(){SystemBase * mobileSystem = new MobileBase ();SystemBase * PCSystem = new Windows10Base ();VIPLevelfirst vipuserpc(PCSystem); //Windows10 的VIP用戶NormalLevel usermobile(PCSystem); //手機(jī)的普通用戶 }?
第一種設(shè)計(jì)模式不利于擴(kuò)展,需要的派生類時(shí)不同維度功能的個(gè)數(shù)的乘積,而第二種將不同維度的抽象方法拆分成變成各自的抽象類,其需要的派生類是不同維度功能的個(gè)數(shù)的和。
橋模式,將不同維度的抽象方法進(jìn)行分離,用抽象指針或者引用將其抽象類相關(guān)聯(lián)
?
?
總結(jié)
以上是生活随笔為你收集整理的设计模式的理解:桥模式 Bridge的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式理解:装饰模式Decorator
- 下一篇: 设计模式理解:工厂模式,抽象工厂,原型方