首页 > 其他 > 详细

[设计模式]桥模式

时间:2020-04-19 22:34:26      阅读:73      评论:0      收藏:0      [点我收藏+]

[设计模式]桥模式

1. 桥模式的设计理念

  “桥模式”与“装饰模式”一样,是对于设计模式中的“单一职责”来进行修改的,其中“装饰模式”是对于很多附加功能的修改,而桥模式是针对多维度。

  桥模式是针对多维度实现装配组合的,举个例子,两个维度,m*n,则要至少实现m*n个类;而如果使用桥模式,在编译时去自由组合,只需要实现m+n个类。

  下面的就是很形象的,其存在两个维度:多平台(安卓,MacOs,Windows)、多版本(简约版,完美版)。

  技术分享图片

  而使用桥模式,将其拆分为两个维度,根据需要来编译时自由组合不同的版本,这样大大减少代码量。

 

2. 反例

  如下代码,是一个很典型的反例,可以看出生成了大量的类来满足不同版本的需求

技术分享图片
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();
}
View Code

 

3. 根据桥模式设计的代码

  如下,假设QQ存在如上所示的六种版本,桥模式的代码如下,可以看到其非常简约,其一个维度中+1只需要开发一个类即可,而不用桥模式的代码需要增加m(n)个类。

#include <stdio.h>
#include <iostream>
#include <windows.h>
using namespace std;

//功能
class QqFunc {
public:
    virtual void SendMessage() = 0; // 发送消息
    virtual void SendPicture() = 0;  // 发送图片
    virtual ~QqFunc() {}
};

// 平台维度基类
class QqPlatform {
public:
    QqFunc* qFunc; // 两个维度在这里建立连接
    QqPlatform(QqFunc* p) :qFunc(p) {} // 初始化实现
    virtual void Login() = 0; // 登录
    virtual void Logon() = 0; // 注册
    virtual ~QqPlatform(){}
};

// 功能1 - 简约版
class QqLite : public QqFunc {
public:
    void SendMessage() {
        cout << "简约版发送消息功能" << endl;
    }
    void SendPicture() {
        cout << "简约版发送图片功能" << endl;
    }
};

// 功能2 - 完美版
class QqPerfect : public QqFunc {
public:
    void SendMessage() {
        cout << "完美版发送消息功能" << endl;
    }
    void SendPicture() {
        cout << "完美版发送图片功能" << endl;
    }
};

// 平台1 - Windows平台
class  QqWindows :public QqPlatform {
public:
    QqWindows(QqFunc* p) : QqPlatform(p) {}
    virtual void Login() {
        cout << "Windows平台下登录" << endl;
    }
    virtual void Logon() {
        cout << "Windows平台下注册" << endl;
    }
};

// 平台2 - Macos平台
class  QqMacos :public QqPlatform {
public:
    QqMacos(QqFunc* p) : QqPlatform(p) {}
    virtual void Login() {
        cout << "QqMacos平台下登录" << endl;
    }
    virtual void Logon() {
        cout << "QqMacos平台下注册" << endl;
    }
};

int main() {
    QqLite* qLite = new QqLite(); // 轻版
    QqMacos* qMacos = new QqMacos(qLite);  // Macos平台
    qMacos->Login();
    qMacos->qFunc->SendPicture();
    
}

[设计模式]桥模式

原文:https://www.cnblogs.com/onetrainee/p/12733475.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!