23種設計模式(六)單一職責之橋模式
動機
由於某些型別的固有的實現邏輯,使得它們具有兩個變化的維度,乃至多個緯度的變化。
設計方法一
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(){}
};
//平臺實現
// PC端
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+m
class 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);
}
這裡的執行時裝配就是一種組合的技術,而不是一種繼承的技術。
模式定義
將抽象部分(業務功能)與實現部分(平臺實現)分離,使它們都可以獨立地變化。
要點總結
Bridge
模式使用“物件間的組合關係”解耦了抽象和實現之間固有的繫結關係,使得抽象和實現可以沿著各自的維度來變化。所謂抽象和實現沿著各自緯度的變化,即“子類化”它們。
Bridge
模式有時候類似於多繼承方案,但是多繼承方案往往違背單一職責原則(即一個類只有一個變化的原因),複用性比較差。Bridge模式是比多繼承方案更好的解決方法。
Bridge
模式的應用一般在“兩個非常強的變化維度”,有時一個類也有多於兩個的變化維度,這時可以使用Bridge的擴充套件模式。
相關文章
- 23種設計模式(六)-責任鏈設計模式設計模式
- 設計模式 - 單一職責設計模式
- 設計模式之-職責鏈模式設計模式
- 設計模式之【職責鏈模式】設計模式
- 淺談23種設計模式之單例設計模式設計模式單例
- Javascript設計模式之職責鏈模式JavaScript設計模式
- Java設計模式之(六)——橋接模式Java設計模式橋接
- 23種設計模式(一)---簡單工廠設計模式設計模式
- C#設計模式之職責鏈模式C#設計模式
- javascript設計模式 之 10 職責鏈模式JavaScript設計模式
- 嘻哈說:設計模式之單一職責原則設計模式
- 設計模式六大原則(一)----單一職責原則設計模式
- 設計模式-職責鏈模式設計模式
- 23種設計模式之組合模式設計模式
- java23種設計模式——六、介面卡模式Java設計模式
- 23種設計模式之介面卡模式設計模式
- 23種設計模式之直譯器模式設計模式
- 23種設計模式之——動態代理模式設計模式
- java23種設計模式—— 二、單例模式Java設計模式單例
- GOF23--23種設計模式(一)Go設計模式
- 23種設計模式之模板方法設計模式
- 畫江湖之23種設計模式設計模式
- 設計模式系列 12– 職責鏈模式設計模式
- JS設計模式五:職責鏈模式JS設計模式
- 簡說設計模式——職責鏈模式設計模式
- 設計模式-職責鏈模式(Chain of Responsibility)設計模式AI
- 23種設計模式之代理模式(靜態代理)設計模式
- 23種設計模式設計模式
- 設計模式之【橋接模式】設計模式橋接
- 設計模式之橋接模式設計模式橋接
- 23種設計模式(八)-原型設計模式設計模式原型
- 23種設計模式(二)---策略設計模式設計模式
- 23種設計模式(四)-代理模式設計模式
- 【重溫23種設計模式】之工廠方法模式設計模式
- 23種設計模式之抽象工廠設計模式抽象
- 23種設計模式(七)-狀態設計模式設計模式
- 23種設計模式(四)- 模板方法設計模式設計模式
- 設計模式之責任鏈模式設計模式