日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

设计模式——桥模式

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

文章目錄

  • 1.“單一職責(zé)”模式
  • 2.動(dòng)機(jī)(Motivation)
  • 3.模式定義
  • 4.要點(diǎn)總結(jié)
  • 5.代碼對(duì)比

1.“單一職責(zé)”模式

在軟件組件的設(shè)計(jì)中,如果責(zé)任劃分的不清晰,使用繼承得到的 結(jié)果往往是隨著需求的變化,子類急劇膨脹,同時(shí)充斥著重復(fù)代碼, 這時(shí)候的關(guān)鍵是劃清責(zé)任。 典型模式 ? Decorator ? Bridge

2.動(dòng)機(jī)(Motivation)

由于某些類型的固有的實(shí)現(xiàn)邏輯,使得它們具有兩個(gè)變化的維度,乃至多個(gè)緯度的變化。如何應(yīng)對(duì)這種“多維度的變化”?如何利用面向?qū)ο蠹夹g(shù)來(lái)使得類型可以輕松地沿著兩個(gè)乃至多個(gè)方向變化, 而不引入額外的復(fù)雜度?

3.模式定義

將抽象部分(業(yè)務(wù)功能)與實(shí)現(xiàn)部分(平臺(tái)實(shí)現(xiàn))分離,使它們都可以獨(dú)立地變化。

4.要點(diǎn)總結(jié)

Bridge模式使用“對(duì)象間的組合關(guān)系”解耦了抽象和實(shí)現(xiàn)之間固有的綁定關(guān)系, 使得抽象和實(shí)現(xiàn)可以沿著各自的維度來(lái)變化。 所謂抽象和實(shí)現(xiàn)沿著各自緯度的變化,即“子類化”它們。Bridge模式有時(shí)候類似于多繼承方案,但是多繼承方案往往違背 單一職責(zé)原則(即一個(gè)類只有一個(gè)變化的原因), 復(fù)用性比較差。Bridge模式是比多繼承方案更好的解決方法。Bridge模式的應(yīng)用一般在“兩個(gè)非常強(qiáng)的變化維度”,有時(shí)一個(gè) 類也有多于兩個(gè)的變化維度, 這時(shí)可以使用Bridge的擴(kuò)展模式。

5.代碼對(duì)比

不好的版本: class Messager{ public:virtual void Login(string username, string password)=0;virtual void SendMessage(string message)=0;virtual void SendPicture(Image image)=0;virtual void PlaySound()=0;virtual void DrawShape()=0;virtual void WriteText()=0;virtual void Connect()=0;virtual ~Messager(){} };//平臺(tái)實(shí)現(xiàn)class PCMessagerBase : public Messager{ public:virtual void PlaySound(){//**********}virtual void DrawShape(){//**********}virtual void WriteText(){//**********}virtual void Connect(){//**********} };class MobileMessagerBase : public Messager{ public:virtual void PlaySound(){//==========}virtual void DrawShape(){//==========}virtual void WriteText(){//==========}virtual void Connect(){//==========} };//業(yè)務(wù)抽象class PCMessagerLite : public PCMessagerBase { public:virtual void Login(string username, string password){PCMessagerBase::Connect();//........}virtual void SendMessage(string message){PCMessagerBase::WriteText();//........}virtual void SendPicture(Image image){PCMessagerBase::DrawShape();//........} };class PCMessagerPerfect : public PCMessagerBase { public:virtual void Login(string username, string password){PCMessagerBase::PlaySound();//********PCMessagerBase::Connect();//........}virtual void SendMessage(string message){PCMessagerBase::PlaySound();//********PCMessagerBase::WriteText();//........}virtual void SendPicture(Image image){PCMessagerBase::PlaySound();//********PCMessagerBase::DrawShape();//........} };class MobileMessagerLite : public MobileMessagerBase { public:virtual void Login(string username, string password){MobileMessagerBase::Connect();//........}virtual void SendMessage(string message){MobileMessagerBase::WriteText();//........}virtual void SendPicture(Image image){MobileMessagerBase::DrawShape();//........} };class MobileMessagerPerfect : public MobileMessagerBase { public:virtual void Login(string username, string password){MobileMessagerBase::PlaySound();//********MobileMessagerBase::Connect();//........}virtual void SendMessage(string message){MobileMessagerBase::PlaySound();//********MobileMessagerBase::WriteText();//........}virtual void SendPicture(Image image){MobileMessagerBase::PlaySound();//********MobileMessagerBase::DrawShape();//........} };void Process(){//編譯時(shí)裝配Messager *m =new MobileMessagerPerfect(); }

好的版本:

class Messager{ protected:MessagerImp* messagerImp;//... public:virtual void Login(string username, string password)=0;virtual void SendMessage(string message)=0;virtual void SendPicture(Image image)=0;virtual ~Messager(){} };class MessagerImp{ public:virtual void PlaySound()=0;virtual void DrawShape()=0;virtual void WriteText()=0;virtual void Connect()=0;virtual MessagerImp(){} };//平臺(tái)實(shí)現(xiàn) n class PCMessagerImp : public MessagerImp{ public:virtual void PlaySound(){//**********}virtual void DrawShape(){//**********}virtual void WriteText(){//**********}virtual void Connect(){//**********} };class MobileMessagerImp : public MessagerImp{ public:virtual void PlaySound(){//==========}virtual void DrawShape(){//==========}virtual void WriteText(){//==========}virtual void Connect(){//==========} };//業(yè)務(wù)抽象 m//類的數(shù)目:1+n+mclass MessagerLite :public Messager {public:virtual void Login(string username, string password){messagerImp->Connect();//........}virtual void SendMessage(string message){messagerImp->WriteText();//........}virtual void SendPicture(Image image){messagerImp->DrawShape();//........} };class MessagerPerfect :public Messager {public:virtual void Login(string username, string password){messagerImp->PlaySound();//********messagerImp->Connect();//........}virtual void SendMessage(string message){messagerImp->PlaySound();//********messagerImp->WriteText();//........}virtual void SendPicture(Image image){messagerImp->PlaySound();//********messagerImp->DrawShape();//........} };void Process(){//運(yùn)行時(shí)裝配MessagerImp* mImp=new PCMessagerImp();Messager *m =new Messager(mImp); }

總結(jié)

以上是生活随笔為你收集整理的设计模式——桥模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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