首页 > 其他分享 >设计模式-桥接模式

设计模式-桥接模式

时间:2023-07-28 23:01:09浏览次数:49  
标签:桥接 接口 实现 抽象 模式 维度 设计模式

桥接模式(Bridge)

模式定义

+ 将抽象部分和实现接口分离,使它们可以独立变化。是一种结构性模式。

UML 图

时序图

角色定义

  1. 抽象类(Abstraction)
    • 用于定义抽象类的接口,其中定义了一个 Implementation 实现类接口的对象,并可以维护该对象,它与 Implementation 具有关联关系
  2. 扩充抽象类(Refined Abstration)
    • 扩充由 Abstraction 定义的接口,通常它不再是抽象类而是具体类,而是提供控制逻辑的变体。与父类一样,它们通过通用实现接口与不同的实现进行交互
  3. 实现类接口(Implementation)
    • 为所有具体实现声明通用接口。抽象部分仅能通过在此处声明的方法与实现对象交互
  4. ConcreteImplementation(具体实现类)
    • 实现具体的特定逻辑功能

优缺点

优点

  1. 分离抽象类极其实现部分。桥接模式使用"对象间的关联关系"解耦了抽象和实现之间独有的绑定关系,使得抽象和实现可以沿着各自的维度变化
  2. 桥接模式比多继承方法方案更好的解决方案
  3. 桥接模式提高了系统的可扩展性,在两个变化的维度中任意扩展一个维度,都不需要修改原有的系统
  4. 实现细节对客户透明,可以对用户隐藏细节。用户在使用时不需要关系实现,在抽象层通过聚合关联关系完成封装和对象组合

缺点

  1. 桥接模式的引入会增加系统的理解和设计难度。聚合关系建立在抽象层,要求开发者针对抽象进行设计和编程
  2. 桥接模式要求正确识别出系统的两个独立变化的维度,因此适用范围具有一定的局限性

应用场景

  1. 当一个类存在两个独立变化的维度,且这两个维度都需要进行拓展时
  2. 当一个系统不希望使用继承或因为多层级的继承导致系统类的个数急剧增加时
  3. 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性是

代码实例

#include<iostream>
using namespace std;

class Serializer
{
public:
    string m_string_ser;
    virtual string getSerializer(){
        cout << "Serializer::getSerializer " << endl;
        // return m_string_ser;
    }
};

class XmlSerializer : public Serializer
{
public:
    XmlSerializer(){
        m_string_ser="XML";
    }
    string getSerializer(){
        return m_string_ser;
    }
};

class JsonSerializer : public Serializer
{
public:
    JsonSerializer(){
        cout << "JsonSerializer " << endl;
        m_string_ser="JSON";
    }
    string getSerializer(){
        cout << "getSerializer" << endl;
        cout << m_string_ser << endl;
        return m_string_ser;
    }  
};

class Connect
{
public:
    string comm_protocol;
    string m_string_ser;
    void show(){
        cout << "show" << endl;
        cout << "support " << comm_protocol << "--" << m_string_ser << endl;
    }
};

class TCPConn : public Connect
{
public:
    TCPConn(Serializer* S){
        cout << "TCPConn1 " << endl;
        comm_protocol = "TCP";
        cout << "TCPConn2 " << endl;

        m_serializer = S;
        cout << "TCPConn3 " << endl;

        m_string_ser = m_serializer->getSerializer();
        cout << "m_string_ser " << m_string_ser << endl;
    }
private:
    Serializer* m_serializer;
};

class HTTPConn : public Connect
{
public:
    HTTPConn(Serializer* Ser){
        comm_protocol = "HTTP";
        m_serializer = Ser;
        m_string_ser = m_serializer->getSerializer();
    }
private:
    Serializer* m_serializer;    
};

int main()
{
    TCPConn* CTCPConn = new TCPConn(new JsonSerializer());
    CTCPConn->show();
    delete CTCPConn;

    HTTPConn* CHTTPConn = new HTTPConn(new XmlSerializer());
    CHTTPConn->show();
    delete CHTTPConn;

    return 0;
}

总结

  1. 桥接模式实现了抽象化和实现化的解耦,相互独立不会影响到对方;
  2. 对于两个独立变化的维度,适合桥接模式的使用;
  3. 分离抽象接口及其实现部分。提出了比继承更好的解决方案

标签:桥接,接口,实现,抽象,模式,维度,设计模式
From: https://www.cnblogs.com/wanghao-boke/p/17589082.html

相关文章

  • Nginx代理模式下 log-format 获取客户端真实IP
    一:环境描述A:  windowsclient    10.43.2.213B:  Nginx  proxy      10.43.2.11C:  Nginx  web-server    10.43.2.54其中,A,B,C三台主机,A是通过windows中的浏览器,B是Nginx代理服务器,C是用Nginx做的web服务器,访问web的流程如下:  A————>......
  • wpf在设计器模式利用模拟数据展现控件
    使用VisualStudio开发WPF应用程序时,控件显示需要的数据如果来路比较“苦难”,比如来自数据库,JSON文件,复杂计算等,这时候,如果想看到控件带有数据的展示效果,需要启动调试,这很麻烦。我们可以在XAML中使用designtime语法给控件赋予模拟数据MSDN教程,也可以在后台使用csharp代码判断当......
  • 如何使用Proxy模式及Java内建的动态代理机制
    http://zhangjunhd.blog.51cto.com/113473/699961.Proxy模式代理模式支持将某些操作从实际的对象中分离出来,通过它的代理类提供处理。这样便于修改和管理这些特定的操作。下面示例一个代理模式的实现。<!--[if!vml]--><!--[endif]--><<interfa......
  • 设计模式
    设计模式设计模式六大原则1)开闭原则(总):对扩展开放,对修改关闭多使用抽象类和接口,用抽象构建架构,用实现进行扩展2)单一职责原则:每个类应该实现单一的职责保证一个类只做一件事,如拆分为实体类和Controller类等3)里氏替换原则:基类可以被子类替换使用抽象类继承,不使用具体类继承,......
  • 策略模式+Spring配置类优化多if..else思路
    图示1.现状场景:假设设备上报不同类型的消息,我们要对不同类型的消息做不同的处理。如果我们通过if..else的方式处理的话会显得比较冗余。例如:if("alarmEvent".equals(msg)){//处理告警消息逻辑...}elseif("deviceBase".equals(msg)){//处理设备上报的基本......
  • python 单例模式
    python单例模式单例模式是一种设计模式,目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。有些类只需要一个全局唯一的实例,例如数据库连接池、线程池、日志记录器等。使用单例模式可以确保这些类只有一个实例存在,从而避免了资源的浪费和不一致的状态。单例模式......
  • Android-单例模式
    单例模式意图:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 publicclassSingleton{privatestaticSingletoninstance=newSingleton();......
  • 掌握 Python RegEx:深入探讨模式匹配
    动动发财的小手,点个赞吧!什么是正则表达式?正则表达式通常缩写为regex,是处理文本的有效工具。本质上,它们由一系列建立搜索模式的字符组成。该模式可用于广泛的字符串操作,包括匹配模式、替换文本和分割字符串。历史数学家StephenColeKleene在20世纪50年代首次引入正则......
  • 八、Web应用模式
    8.1、web应用模式在开发Web应用中,有两种应用模式:前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。前后端分离【把前端的界面效果(html,css,js分离到另一个服务端,python服务端只需要返回数据即可)】前端形成一个独立的网站,服务端构成一个独立的网......
  • Keepalived非抢占模式配置
    Keepalived非抢占模式配置1、前言非抢占模式,这种模式主要是针对主机崩溃,集群已经重新选出新的主机,并且原来的主机重新上线后并不争夺主机的情况。这种模式适合那些倾向于认为崩溃的主机即便上线还是会出现崩溃的场景。这种模式的核心思想是将所有节点的优先级(priority)值设为相......