设计模式——Bridge 桥模式
生活随笔
收集整理的這篇文章主要介紹了
设计模式——Bridge 桥模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1.動機
- 2.定義
- 3.代碼
- 4.總結
1.動機
由于某些類型的固有的實現邏輯,使得它們具有兩個變化的維度,乃至多個緯度的變化。
如何應對這種“多維度的變化”?
如何利用面向對象技術來使得類型可以輕松地沿著兩個乃至多個方向變化,而不引入額外的復雜度?
2.定義
將抽象部分(業務功能)與實現部分(平臺實現)分離,使它們都可以獨立地變化。
3.代碼
未使用橋模式
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(){} };//平臺實現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(){//==========} };//業務抽象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(){//編譯時裝配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(){} };//平臺實現 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(){//==========} };//業務抽象 m//類的數目: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(){//運行時裝配MessagerImp* mImp=new PCMessagerImp();Messager *m =new Messager(mImp); }4.總結
Bridge模式使用“對象間的組合關系”解耦了抽象和實現之間固 有的綁定關系,使得抽象和實現可以沿著各自的維度來變化。所謂抽象和實現沿著各自緯度的變化,即“子類化”它們。
Bridge模式有時候類似于多繼承方案,但是多繼承方案往往違背 單一職責原則(即一個類只有一個變化的原因),復用性比較差。
Bridge模式是比多繼承方案更好的解決方法。
Bridge模式的應用一般在“兩個非常強的變化維度”,有時一個 類也有多于兩個的變化維度,這時可以使用Bridge的擴展模式。
總結
以上是生活随笔為你收集整理的设计模式——Bridge 桥模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无类别地址CIDR概述
- 下一篇: asp.net ajax控件工具集 Au