设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

news2025/1/13 7:39:33

上一篇《适配器模式》                                                                 下一篇《装饰器模式》

简介:

桥接模式,它是一种结构型设计模式,它的主要目的是将抽象部分与具体实现部分分离,使它们都可以独立地变化。桥接模式通过使用封装、聚合及继承等行为让不同的类承担不同的职责,从而把抽象(Abstraction)与行为实现(Implementation)分离开来,以保持各部分的独立性以及应对他们的功能扩展。

桥接模式的结构包括以下主要角色:
1、抽象类(AbstractClass):定义了抽象接口,并实现了部分功能。
2、具体实现类(ConcreteClass):实现了抽象类所定义的具体接口,完成抽象类的功能实现。
3、桥接类(BridgeClass):将抽象类和具体实现类连接起来,使得它们可以独立地变化。

桥接模式的使用场景:
1、系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系。此时,可以通过桥接模式使他们在抽象层建立一个关联关系。
2、系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
3、一个类存在两个独立变化的维度,而这两个维度都需要进行扩展。

桥接模式的创建步骤:
1、创建抽象类(AbstractClass),它定义了抽象接口,并实现了部分功能。
2、创建具体实现类(ConcreteClass),它实现了抽象类所定义的具体接口,完成抽象类的功能实现。
3、创建桥接类(BridgeClass),它将抽象类和具体实现类连接起来,使得它们可以独立地变化。

桥接模式的优点,主要包括:
1、分离抽象及其实现部分:桥接模式通过将抽象部分与实现部分分离,使得它们可以独立地变化。这种分离有助于降低对实现部分编译时刻的依赖性,当改变一个实现类时,并需要重新编译抽象类和它的客户程序。同时,接口与实现分离有助于分层,从而产生更好的结构化系统,系统的高层部分仅需知道抽象类和具体实现类即可。
2、提高可扩充性:桥接模式使得抽象类和具体实现类可以独立地变化,因此可以独立地对它们进行扩展。这种扩展能力有助于提高系统的可维护性和可重用性。
3、优秀的扩展能力:桥接模式使得抽象类和具体实现类可以独立地变化,因此可以灵活地添加新的具体实现类,以满足新的需求。这种扩展能力使得系统能够适应未来的变化和发展。

总之,桥接模式通过将抽象部分与实现部分分离,提高了系统的可维护性、可重用性和可扩展性,同时降低了系统的复杂性。

桥接模式的缺点,主要包括:
1、增加了系统的理解和设计难度。由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程,正确识别出系统中两个独立变化的维度并不容易。
2、可能增加系统的复杂性。对于一些不希望使用继承或因为多层继承导致系统类的个数剧增的场景,可能需要考虑使用桥接模式,这会增加系统的复杂性和理解难度。

总之,桥接模式虽然可以提高系统的可维护性、可重用性和可扩展性,但也增加了系统的复杂性和理解难度。因此,在使用桥接模式时需要权衡其优缺点,根据实际需求进行选择。

示例:

一、C#桥接模式

以下是一个示例,展示了如何在C#中实现桥接模式:

using System;  
  
namespace BridgePatternExample  
{  
    // 抽象类  
    public abstract class Abstraction  
    {  
        protected Implementor implementor;  
      
        public void SetImplementor(Implementor implementor)  
        {  
            this.implementor = implementor;  
        }  
      
        public abstract void Operation();  
    }  
      
    // 具体实现类  
    public class ConcreteAbstraction : Abstraction  
    {  
        public override void Operation()  
        {  
            implementor.Operation();  
        }  
    }  
  
    // 实现接口  
    public interface Implementor  
    {  
        void Operation();  
    }  
      
    // 具体实现类1  
    public class ConcreteImplementor1 : Implementor  
    {  
        public void Operation()  
        {  
            Console.WriteLine("Concrete Implementor 1 operation");  
        }  
    }  
      
    // 具体实现类2  
    public class ConcreteImplementor2 : Implementor  
    {  
        public void Operation()  
        {  
            Console.WriteLine("Concrete Implementor 2 operation");  
        }  
    }
  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Abstraction abstraction = new ConcreteAbstraction();  
            abstraction.SetImplementor(new ConcreteImplementor1()); // 第一个实现类操作  
            abstraction.Operation(); // 输出 "Concrete Implementor 1 operation"  
            abstraction.SetImplementor(new ConcreteImplementor2()); // 第二个实现类操作  
            abstraction.Operation(); // 输出 "Concrete Implementor 2 operation"  
        }   
    }   
}

二、java桥接模式

桥接模式通常通过以下方式实现:

// 抽象类  
public abstract class AbstractClass {  
    protected Implementor implementor;  
    
    public void setImplementor(Implementor implementor) {  
        this.implementor = implementor;  
    }  
    
    public abstract void operation();  
}  
   
// 具体实现类  
public class ConcreteClass extends AbstractClass {  
    @Override  
    public void operation() {  
        implementor.operation();  
    }  
}  
   
// 实现接口  
public interface Implementor {  
    void operation();  
}  
   
// 具体实现类1  
public class ConcreteImplementor1 implements Implementor {  
    @Override  
    public void operation() {  
        System.out.println("Concrete Implementor 1 operation");  
    }  
}  
   
// 具体实现类2  
public class ConcreteImplementor2 implements Implementor {  
    @Override  
    public void operation() {  
        System.out.println("Concrete Implementor 2 operation");  
    }  
}

//在客户端中创建上下文对象并注入具体策略对象
public class Main {  
    public static void main(String[] args) {  
        AbstractClass abstraction = new ConcreteClass();  
        abstraction.setImplementor(new ConcreteImplementor1()); // 第一个实现类操作  
        abstraction.operation(); // 输出 "Concrete Implementor 1 operation"  
        abstraction.setImplementor(new ConcreteImplementor2()); // 第二个实现类操作  
        abstraction.operation(); // 输出 "Concrete Implementor 2 operation"
    }
}

三、javascript桥接模式

在JavaScript中,桥接实现方式如下:

// 抽象类  
class AbstractClass {  
  constructor(bridge) {  
    this.bridge = bridge;  
  }  
  
  operation() {  
    this.bridge.implementationOperation();  
  }  
}  
  
// 具体实现类  
class ConcreteClass1 {  
  implementationOperation() {  
    console.log('ConcreteClass1 operation');  
  }  
}  
  
class ConcreteClass2 {  
  implementationOperation() {  
    console.log('ConcreteClass2 operation');  
  }  
}  
  
// 桥接类  
class BridgeClass extends AbstractClass {  
  constructor(implementation) {  
    super(implementation);  
  }  
}

const bridge1 = new BridgeClass(new ConcreteClass1());  
const bridge2 = new BridgeClass(new ConcreteClass2());  
    
bridge1.operation(); // 输出 "ConcreteClass1 operation"  
bridge2.operation(); // 输出 "ConcreteClass2 operation"

四、C++桥接模式

以下是在C++中实现桥接模式:

#include <iostream>  
  
// 抽象类  
class AbstractClass {  
public:  
    virtual void operation() = 0;  
};  
  
// 具体实现类1  
class ConcreteClass1 : public AbstractClass {  
public:  
    void operation() override {  
        std::cout << "ConcreteClass1 operation" << std::endl;  
    }  
};  
  
// 具体实现类2  
class ConcreteClass2 : public AbstractClass {  
public:  
    void operation() override {  
        std::cout << "ConcreteClass2 operation" << std::endl;  
    }  
};  
  
// 桥接类  
class BridgeClass {  
public:  
    AbstractClass* abstract;  
    BridgeClass(AbstractClass* a) : abstract(a) {}  
    void operation() { abstract->operation(); }  
};  
  
int main() {  
    AbstractClass* a = new ConcreteClass1(); // 使用具体实现类1创建抽象类的对象  
    BridgeClass b(a); // 使用桥接类与抽象类的对象进行交互  
    b.operation(); // 输出 "ConcreteClass1 operation"  
    delete a; // 释放内存  
    a = new ConcreteClass2(); // 使用具体实现类2创建抽象类的对象  
    b.operation(); // 输出 "ConcreteClass2 operation"  
    delete a; // 释放内存  
    return 0;  
}

五、python桥接模式

以下是在python中实现桥接模式:

from abc import ABC, abstractmethod  
  
# 抽象类  
class AbstractClass(ABC):  
    @abstractmethod  
    def operation(self):  
        pass  
  
# 具体实现类1  
class ConcreteClass1(AbstractClass):  
    def operation(self):  
        print("ConcreteClass1 operation")  
  
# 具体实现类2  
class ConcreteClass2(AbstractClass):  
    def operation(self):  
        print("ConcreteClass2 operation")  
  
# 桥接类  
class BridgeClass:  
    def __init__(self, abstract_class):  
        self.abstract_class = abstract_class  
      
    def operation(self):  
        self.abstract_class.operation()  
  
# 使用示例:  
bridge1 = BridgeClass(ConcreteClass1())  
bridge2 = BridgeClass(ConcreteClass2())  
bridge1.operation() # 输出 "ConcreteClass1 operation"  
bridge2.operation() # 输出 "ConcreteClass2 operation"

六、go桥接模式

以下是一个示例,展示了如何在go中实现桥接模式:

package main  
  
import "fmt"  
  
// 抽象类  
type AbstractClass struct {  
    BridgeClass  
}  
  
func (ac *AbstractClass) Operation() {  
    ac.BridgeClass.Operation()  
}  
  
// 具体实现类1  
type ConcreteClass1 struct{}  
  
func (cc1 *ConcreteClass1) Operation() {  
    fmt.Println("ConcreteClass1 operation")  
}  
  
// 具体实现类2  
type ConcreteClass2 struct{}  
  
func (cc2 *ConcreteClass2) Operation() {  
    fmt.Println("ConcreteClass2 operation")  
}  
  
// 桥接类  
type BridgeClass struct {  
    impl interface{}  
}  
  
func (bc *BridgeClass) Operation() {  
    bc.impl.Operation()  
}  
  
func main() {  
    abstract := &AbstractClass{&BridgeClass{&ConcreteClass1{}}}  
    abstract.Operation() // 输出 "ConcreteClass1 operation"  
  
    abstract.BridgeClass.impl = &ConcreteClass2{}  
    abstract.Operation() // 输出 "ConcreteClass2 operation"  
}

七、PHP桥接模式

以下是一个示例,展示了如何在PHP中实现桥接模式:

<?php  
  
// 抽象类  
abstract class AbstractClass {  
    protected $bridge;  
      
    public function __construct(BridgeClass $bridge) {  
        $this->bridge = $bridge;  
    }  
      
    abstract public function operation();  
}  
  
// 具体实现类1  
class ConcreteClass1 implements AbstractClass {  
    public function operation() {  
        echo "ConcreteClass1 operation\n";  
    }  
}  
  
// 具体实现类2  
class ConcreteClass2 implements AbstractClass {  
    public function operation() {  
        echo "ConcreteClass2 operation\n";  
    }  
}  
  
// 桥接类  
class BridgeClass {  
    protected $implementation;  
      
    public function __construct(Implementation $implementation) {  
        $this->implementation = $implementation;  
    }  
      
    public function operation() {  
        $this->implementation->operation();  
    }  
}  
  
// 使用示例:  
$bridge1 = new BridgeClass(new ConcreteClass1());  
$bridge2 = new BridgeClass(new ConcreteClass2());  
$bridge1->operation(); // 输出 "ConcreteClass1 operation"  
$bridge2->operation(); // 输出 "ConcreteClass2 operation"


《完结》

上一篇《适配器模式》                                                               下一篇《装饰器模式》          

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1137224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【码银送书第九期】《ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践》

计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术&#xff0c;也在不断地影响和改变着各个行业。 如今&#xff0c;我们正在见证人工智能技术的…

九方面解读国家数据局成立,可交易数据的五大特性探讨

​ 10月25日&#xff0c;国家数据局正式揭牌&#xff0c;标志着我国数据管理进入了新的阶段。国家数据局负责协调推进数据基础制度建设&#xff0c;统筹数据资源整合共享和开发利用&#xff0c;统筹推进数字中国、数字经济、数字社会规划和建设等&#xff0c;由国家发展和改革…

LeetCode刷题---简单组(四)

文章目录 &#x1f352;题目一 27. 移除元素&#x1f352;解法一&#x1f352;题目二 28. 找出字符串中第一个匹配项的下标&#x1f352;解法一&#x1f352;题目三 35. 搜索插入位置&#x1f352;解法一 &#x1f352;题目一 27. 移除元素 给你一个数组 nums 和一个值 val&…

MyBatis-Plus代码自动生成

前言 这是一段使用 MyBatis-Plus 自动生成代码的示例代码。MyBatis-Plus 是一个优秀的 ORM 框架&#xff0c;它在 MyBatis 的基础上进行了扩展和增强&#xff0c;提供了更加便捷、高效的数据库操作方式。在实际开发中&#xff0c;我们通常需要编写大量的 CRUD 操作代码&#x…

OpenCV官方教程中文版 —— 2D 直方图

OpenCV官方教程中文版 —— 2D 直方图 前言一、介绍二、OpenCV 中的 2D 直方图三、Numpy 中 2D 直方图四、绘制 2D 直方图 前言 本节我们会学习如何绘制 2D 直方图&#xff0c;我们会在下一节中使用到它。 一、介绍 在前面的部分我们介绍了如何绘制一维直方图&#xff0c;之…

TeamViewer

爱情就像两个拉皮筋的人&#xff0c;受伤的总是不愿放手的那一个&#xff01; TeamViewer – 远程连接软件 点击下载 电脑版就下载电脑 安卓版就下载安卓 苹果版就下苹果

bug:Chrome插件SwitchyOmega安装时程序包无效:“CRX_HEADER_INVALID“问题

bug&#xff1a;Chrome插件SwitchyOmega安装时程序包无效:“CRX_HEADER_INVALID“问题 1 解决 先说解决办法&#xff1a; 将下载的crx重命名为xxx.zip&#xff0c;然后解压打开chrome的开发者模式 点击加载已解压的应用程序&#xff0c;然后选择我们解压后的文件夹即可 安装成…

MyBatisPlus自动填充

文章目录 MyBatisPlus自动填充应用场景在实体类里面规定要填充的字段写处理器测试 MyBatisPlus自动填充 应用场景 我们往数据库里面插入一条记录&#xff0c;或者是更新一条记录的时候&#xff0c;往往需要有插入时间和更新时间&#xff0c;如果每条sql语句里面都这样写&…

Spring使用注解进行注入

目录 前言 一、属性注入 1.1 属性注入的优缺点分析 二、Setter注入 2.1 Setter注入优缺点分析 三、构造方法注入 3.1 构造注入的优缺点 四、Qualifier注解 五、Resource注解 六、Resource注解与Autowired注解的区别 前言 在之前我们就已经了解过了Spring依赖注入的方式&#x…

word页脚设置,页脚显示第几页共有几页设置步骤

word页脚设置&#xff0c;页脚显示第几页共有几页设置步骤&#xff1a; 具体步骤&#xff1a; 步骤1&#xff1a; 步骤1.1选择页脚---空白页脚 步骤1.2&#xff0c;在"[在此处键入]"&#xff0c;直接输入你需要的格式&#xff0c;如 “第页/共页” 步骤1.3选择第“…

基于ssm服装购物系统

功能如图所示 摘要 基于SSM框架的服装购物系统研究在当今数字化时代具有更为广泛的重要意义。首先&#xff0c;电子商务已成为商业领域的重要发展方向&#xff0c;尤其在全球范围内&#xff0c;服装零售商面临着不断增长的在线购物需求。这种研究能够帮助服装零售商迅速适应市场…

Failed to prepare the device for development

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

班级管理神器

哈喽&#xff0c;亲爱的小红书教育朋友们&#xff01;今天来分享一个重磅好物&#xff1a;班级查询系统&#xff01;是的&#xff0c;你没有听错&#xff0c;让我们的孩子们告别信息混乱&#xff0c;告别手动统计&#xff0c;迎接高效、智能的班级管理新时代&#xff01; 班级查…

appium+selenium自动化测试UI踩坑记录之--判断元素是否存在

判断应用程序元素是否存在&#xff0c;之前使用的代码如下&#xff0c;但是页面跳转后&#xff0c;通过xpath查找信息能查找到跳转前页面的内容&#xff0c;造成信息判断不准确。 # 从selenium.common.exceptions 模块导入 NoSuchElementException类from selenium.common.excep…

mysql主从搭建(gtid)

搭建mysql主从使用三台主机&#xff0c;主机信息如下 ip端口主机名角色10.1.60.803306rabbitmq04salve10.1.60.1143306rabbitmq01slave10.1.60.1153306rabbitmq02master 为每台主机修改主机名并配置hosts hostnamectl set-hostname rabbitmq04 vi /etc/hosts 10.1.60.114 …

【飞控调试】无人机电调哔-哔-哔-哔-哔...发出急促的响声

硬件 飞控&#xff1a;Pixhawk 6C mini 电调&#xff1a;好盈hobbywing Platinum 40A 固件&#xff1a;PX4 V1.13.3 问题 电调上电后&#xff0c;电机发出哔-哔-哔-哔-哔…发出急促的响声&#xff0c;进行电调校准也没用。 解决 在QGC里把SYS_USE_IO参数改成Disabled&…

Hyperledger Fabric搭建测试网络

本文使用的Fabric版本&#xff1a;V2.5.4 Ubuntu系统&#xff1a;16.04LTS 前序文章已经详细介绍了如何安装部署Hyperledger Fabric系统&#xff0c;这里不再赘述。本篇文章主要介绍如何使用Fabric的测试网络。在正式开始之前&#xff0c;有一点需要说明&#xff1a; Hyperled…

IndexError: Target 34 is out of bounds.

问题出现在训练用的标签处&#xff0c;标签超过范围&#xff0c;换了数据集后标签数发生改变&#xff0c;总而言之是目标分类数量超过了你所设置的标签数量的范围&#xff0c;归根结底是全连接参数没有改过来。找到label位置改一下数量

C# 图解教程 第5版 —— 第8章 类和继承

文章目录 8.1 类继承8.2 访问继承的成员&#xff08;*&#xff09;8.3 所有类都派生自 object 类8.4 屏蔽基类的成员8.5 基类访问8.6 使用基类的引用8.6.1 虚方法和覆写方法8.6.2 覆写标记为 override 的方法8.6.3 覆盖其他类型成员&#xff08;*&#xff09; 8.7 构造函数的执…

2011-2021年“第四期”数字普惠金融指数与上市公司匹配(根据省份匹配)/上市公司数字金融指数匹配

2011-2021年“第四期”数字普惠金融指数与上市公司匹配&#xff08;根据省份匹配&#xff09;/上市公司数字金融指数匹配 1、时间&#xff1a;2011-2021年 2、指标&#xff1a;股票代码、年份、行政区划代码、行业名称 、行业代码、所属省份、数字普惠金融指数、覆盖广度、使…