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

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

简介:

桥接模式,它是一种结构型设计模式,它的主要目的是将抽象部分与具体实现部分分离,使它们都可以独立地变化。桥接模式通过使用封装、聚合及继承等行为让不同的类承担不同的职责,从而把抽象(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.mfbz.cn/a/107565.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL server 代理服务启动和查看

设置重启 使用管理员权限登录到运行 SQL Server 代理服务的计算机。 打开 Windows 服务管理器。可以通过按下 Windows 键 R&#xff0c;然后键入 "services.msc" 并按 Enter 来打开服务管理器。 在服务列表中&#xff0c;找到 "SQL Server Agent" 服务&…

网络协议--TFTP:简单文件传送协议

15.1 引言 TFTP(Trivial File Transfer Protocol)即简单文件传送协议&#xff0c;最初打算用于引导无盘系统&#xff08;通常是工作站或X终端&#xff09;。和将在第27章介绍的使用TCP的文件传送协议&#xff08;FTP&#xff09;不同&#xff0c;为了保持简单和短小&#xff0…

无需更换vue-cli 脚手架 uniapp-搭建项目-H5-低版本安卓IOS兼容问题(白屏)(接口请求异常)

✨求关注~ &#x1f4bb;博客&#xff1a;www.protaos.com I. 简介 A. UniApp项目概述 B. 白屏和接口请求异常问题的背景 II. 白屏问题 A. 问题描述 1、uniapp 打包H5内嵌入APP内、低版本手机系统访问白屏问题 B. 问题根本原因 1、低版本手机系统 自带的webview内核不支持ES6语…

Java练习题2020-4

小明今天收了N个鸡蛋&#xff0c;每个鸡蛋各有重量&#xff0c;现在小明想找M个重量差距最小的鸡蛋摆成一盒出售&#xff0c;输出符合条件的最重一盒鸡蛋的总重量 输入说明&#xff1a;第一行&#xff0c;鸡蛋个数N(N<1000) 每盒个数M(M<N)&#xff1b;第二行&#xff0…

Jtti:Apache服务的反向代理及负载均衡怎么配置

配置Apache服务的反向代理和负载均衡可以帮助您分散负载并提高应用程序的可用性和性能。下面是一些通用的步骤&#xff0c;以配置Apache反向代理和负载均衡。 1. 安装和配置Apache&#xff1a; 确保您已经安装了Apache HTTP服务器。通常&#xff0c;Apache的配置文件位于/etc…

Linux进程控制(一)

前言&#xff1a;Linux进程控制是指在Linux操作系统中&#xff0c;对进程的创建、运行、管理和终止等方面进行控制的一系列机制和技术。Linux作为一个多任务操作系统&#xff0c;能够同时运行多个进程任务的执行&#xff0c;继前面我们对Linux进程创建的学习之后&#xff0c;今…

CSP-J 2023 第二轮认证入门级(含答案)

一。题目 二。答案 T1 ⼩苹果&#xff08;apple&#xff09; 每⼀轮拿掉的苹果数量为 。模拟拿苹果的过程&#xff0c;每⼀轮中令 &#xff0c;当 时最后⼀个苹果会被拿掉。 时间复杂度为对数。 #include <iostream> using namespace std; int n; int ans1, ans2; boo…

上海高考语文命题趋势和备考建议?附1990年-2023年高考语文真题和答案资源

虽然语文是我们的母语&#xff0c;但是语文从小到大都是我们学习的重点&#xff0c;更是难点&#xff0c;分值也是最高的科目之一。甚至很多时候&#xff0c;语文科目的分值差会带来最终的分值差。综观各个省市的高考状元&#xff0c;基本上语文科目都在130分以上&#xff08;满…

【DOCKER】

Docker 出现&#xff1a; 解决了运行环境和配置问题的软件容器。 方便做持续集成并有助于整体发布的容器虚拟化技术。 面试题&#xff1a; 容器和虚拟机比较&#xff1f; 区别&#xff1a; 1.Docker的三件套 1.镜像&#xff1a; 2.容器 3.仓库 2. 基础架构图 2.…

JavaScript_Pig Game切换当前玩家

const current0El document.getElementById(current--0); const current1El document.getElementById(current--1); if (dice ! 1) {currentScore dice;current0El.textContent currentScore;} else {} });这是我们上个文章写的代码&#xff0c;这个代码明显是有问题的&…

【爬虫】python打包可执行程序(ui界面制作完成后)

1.安装pyinstaller pip install pyinstaller可能出现连接超时安装不上的情况,可以切换源进行下载 pip install -i http://pypi.douban.com/simple/ pyinstaller2.打包程序 pyinstaller xxxxx.py --noconsole --hidden-import PySide6.QtXml

基于非侵入式负荷检测与分解的电力数据挖掘

基于非侵入式负荷检测与分解的电力数据挖掘 在这里插入图片描述 **摘要&#xff1a;本案例将根据已收集到的电力数据&#xff0c;深度挖掘各电力设备的电流、电压和功率等情况&#xff0c;分析各电力设备的实际用电量&#xff0c;进而为电力公司制定电能能源策略提供一定的参…

element ui el-table表格纵向横向滚动条去除并隐藏空白占位列

需求 当table内容列过多时&#xff0c;可通过height属性设置table高度以固定table高度、固定表头&#xff0c;使table内容可以滚动 现在需求是右侧滚动条不好看&#xff0c;需要去除滚动条&#xff0c;并隐藏滚动条所占列的位置 // ----------修改elementui表格的默认样式-…

雨云游戏云面板服使用教程我的世界Forge服务端开服教程(翼龙面板)

雨云面板服目前支持一键开服的游戏有&#xff1a;Minecraft Java版、Minecraft 基岩版、泰拉瑞亚、饥荒&#xff0c;还提供纯Java/Linux环境&#xff08;Docker&#xff09;&#xff0c;方便开自己开其他游戏服。 其中Minecraft Java版支持一键开服的有Arclight、Mohist、CatS…

如何使用gpt提高效率

如何使用gpt提高效率 自动化替代人力工作减少创意工作需求技术依赖风险实际应用领域内容生成自动回答问题自动化编程个性化推荐 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&…

shouldComponentUpdate 是做什么的?

目录 前言 生命周期函数 shouldComponentUpdate 的写法和用法 代码 事件和API 优缺点 方法 总结 理论 结论 shouldComponentUpdate 是 React 类组件中的一个生命周期方法&#xff0c;用于决定一个组件的 props 或 state 发生变化时是否应该重新渲染。默认情况下&…

jenkins自动化操作步骤(gitblit)

1、登陆地址&#xff1a; http://xxxxxxxxx.org:xxxx/ admin/xxxx 2、创建任务 选择构建一个maven项目 3、配置 最多只保留一天一个任务 选择git仓库和账号密码 选择代码对应分支 build项&#xff1a; 1&#xff09;使用父项目的pom文件&#xff1a;k56-boot/pom.xml 2&…

【Javascript】定时器

目录 延迟执行 定时执行 清除定时任务 延迟执行 setTimeout(function(){}, 毫秒) console.log(1); console.log(2); console.log(3); setTimeout(function (){console.log(5) },5000) console.log(4);setTimeout(function (){ console.log(5) },5000) 设定了一个任务&…

C++STL----list的使用

文章目录 list简介list的使用默认成员函数的使用list容器元素的修改front和backpush_front和pop_frontpush_back和pop_backinserterase list迭代器begin和endrbegin和rend list大小控制resizeclear list操作函数sortspliceremoveremove_ifuniquemergereverseassign CSTL----lis…

如何快速解决d3dcompiler_43.dll缺失问题?五种方法快速解决

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“D3DCompiler_43.dll缺失”。这个错误通常会导致游戏、应用程序或系统无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些修复方案来恢复缺失的文件。本文将介绍五个修复D3DCompi…
最新文章