日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式的理解:桥模式 Bridge

發(fā)布時(shí)間:2024/10/14 asp.net 123 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式的理解:桥模式 Bridge 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ? ?當(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。