当前位置: 首页 > news >正文

设计模式:桥接模式(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.lryc.cn/news/208242.html

相关文章:

  • error: the following arguments are required: --model, --data 解决方法
  • Kafka - 消息队列的两种模式
  • 【Go】格式化字符串指令大全 Redis常用命令
  • Windows 和 Linux 这2个系统在进行编程实现的时候的一些区别:
  • [SQL开发笔记]SQL 别名:为表名称或列名称指定别名
  • 风险管理案例题
  • NFC读卡器ST25R3911B-AQWT、ST25R3917B-AQET、ST25R3919B-AQET产品描述、功能框图
  • JVM进阶(2)
  • 2023大湾区杯粤港澳金融数学建模竞赛思路+模型+代码
  • 【Note详细图解】中缀表达式如何转为后缀表达式?数据结构
  • 常用到的资源共享网站
  • 关于JAVA中字节码文件版本号、产品版本号及开发版本号的关系
  • ModbusTCP 转 Profinet 主站网关在博图配置案例
  • 抖音上怎么挂小程序?制作小程序挂载抖音视频
  • AI新能量!FortiGate NGFW面向数据中心全面集成FortiGuard AI 安全服务
  • Git总结
  • 初级前端面试题(一) 之 html/css/js
  • python实现excel的数据提取
  • Vue的MVVM实现原理
  • vue+iView 动态侧边栏菜单保持高亮选中
  • 标准的听觉检测环境应满足哪些条件?
  • Fabric.js 样式不更新怎么办?
  • 【优选算法精品】前缀和
  • 应用案例|基于高精度三维机器视觉引导机器人自动分拣包裹的应用
  • Vue自定义指令实现按钮级的权限控制
  • Selenium实现自动登录163邮箱和Locating Elements介绍
  • uniapp vue2、vue3 页面模板代码块设置
  • 解决Linux下编译Intel oneTBB动态库出错的问题
  • 分布式日志和链路追踪
  • el-select multiple表单校验问题