【设计模式】【结构型模式(Structural Patterns)】之桥接模式(Bridge Pattern

server/2024/11/27 6:15:37/

1. 设计模式原理说明

桥接模式(Bridge Pattern) 是一种结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立变化。这种模式有助于解决因实现细节的变化而导致的代码膨胀问题。桥接模式的核心思想是通过组合而不是继承来达到解耦的目的,从而提高系统的灵活性和可扩展性。

主要角色
  1. Abstraction(抽象类):定义了抽象类的接口,并持有一个对实现部分的引用。
  2. RefinedAbstraction(扩展抽象类):扩展了抽象类,可能包含更多的业务逻辑或责任。
  3. Implementor(实现接口):定义了实现类的接口,通常由多个具体实现类实现。
  4. ConcreteImplementorA/B(具体实现类):实现了 Implementor 接口,提供了具体的实现。

2. UML 类图及解释

UML 类图
+-----------------+                +-----------------+
|   Abstraction   |                | Implementor     |
|-----------------|                |-----------------|
| - implementor: Implementor       | + operation(): void|
| + operation(): void              |                   |
+-----------------+                +-----------------+^                             ^|                             ||                             |v                             v
+-----------------+                +-----------------+
| RefinedAbstraction|              | ConcreteImplementorA |
|-----------------|                |-----------------|
| + refinedOperation(): void       | + operation(): void |
+-----------------+                +-----------------++||v
+-----------------+
| ConcreteImplementorB |
|-----------------|
| + operation(): void |
+-----------------+
类图解释
  • Abstraction:定义了抽象类的接口,并持有一个对 Implementor 的引用。客户端通过这个接口与具体实现进行交互。
  • RefinedAbstraction:扩展了 Ab abstraction,可能包含更多的业务逻辑或责任。
  • Implementor:定义了实现类的接口,通常由多个具体实现类实现。
  • ConcreteImplementorA 和 ConcreteImplementorB:实现了 Implementor 接口,提供了具体的实现。

3. 代码案例及逻辑详解

Java 代码案例
// 实现接口
interface Implementor {void operation();
}// 具体实现类 A
class ConcreteImplementorA implements Implementor {@Overridepublic void operation() {System.out.println("ConcreteImplementorA operation");}
}// 具体实现类 B
class ConcreteImplementorB implements Implementor {@Overridepublic void operation() {System.out.println("ConcreteImplementorB operation");}
}// 抽象类
abstract class Abstraction {protected Implementor implementor;public Abstraction(Implementor implementor) {this.implementor = implementor;}public abstract void operation();
}// 扩展抽象类
class RefinedAbstraction extends Abstraction {public RefinedAbstraction(Implementor implementor) {super(implementor);}@Overridepublic void operation() {implementor.operation();}
}// 客户端
public class Client {public static void main(String[] args) {Implementor implA = new ConcreteImplementorA();Implementor implB = new ConcreteImplementorB();Abstraction abstraction = new RefinedAbstraction(implA);abstraction.operation(); // 输出: ConcreteImplementorA operationabstraction = new RefinedAbstraction(implB);abstraction.operation(); // 输出: ConcreteImplementorB operation}
}
C++ 代码案例
#include <iostream>// 实现接口
class Implementor {
public:virtual void operation() = 0;virtual ~Implementor() {}
};// 具体实现类 A
class ConcreteImplementorA : public Implementor {
public:void operation() override {std::cout << "ConcreteImplementorA operation" << std::endl;}
};// 具体实现类 B
class ConcreteImplementorB : public Implementor {
public:void operation() override {std::cout << "ConcreteImplementorB operation" << std::endl;}
};// 抽象类
class Abstraction {
protected:Implementor* implementor;public:Abstraction(Implementor* impl) : implementor(impl) {}virtual ~Abstraction() { delete implementor; }virtual void operation() = 0;
};// 扩展抽象类
class RefinedAbstraction : public Abstraction {
public:RefinedAbstraction(Implementor* impl) : Abstraction(impl) {}void operation() override {implementor->operation();}
};// 客户端
int main() {Implementor* implA = new ConcreteImplementorA();Implementor* implB = new ConcreteImplementorB();Abstraction* abstraction = new RefinedAbstraction(implA);abstraction->operation(); // 输出: ConcreteImplementorA operationdelete abstraction;abstraction = new RefinedAbstraction(implB);abstraction->operation(); // 输出: ConcreteImplementorB operationdelete abstraction;return 0;
}
Python 代码案例
# 实现接口
class Implementor:def operation(self):pass# 具体实现类 A
class ConcreteImplementorA(Implementor):def operation(self):print("ConcreteImplementorA operation")# 具体实现类 B
class ConcreteImplementorB(Implementor):def operation(self):print("ConcreteImplementorB operation")# 抽象类
class Abstraction:def __init__(self, implementor):self.implementor = implementordef operation(self):pass# 扩展抽象类
class RefinedAbstraction(Abstraction):def operation(self):self.implementor.operation()# 客户端
if __name__ == "__main__":implA = ConcreteImplementorA()implB = ConcreteImplementorB()abstraction = RefinedAbstraction(implA)abstraction.operation()  # 输出: ConcreteImplementorA operationabstraction = RefinedAbstraction(implB)abstraction.operation()  # 输出: ConcreteImplementorB operation
Go 代码案例
package mainimport "fmt"// 实现接口
type Implementor interface {Operation()
}// 具体实现类 A
type ConcreteImplementorA struct{}func (c *ConcreteImplementorA) Operation() {fmt.Println("ConcreteImplementorA operation")
}// 具体实现类 B
type ConcreteImplementorB struct{}func (c *ConcreteImplementorB) Operation() {fmt.Println("ConcreteImplementorB operation")
}// 抽象类
type Abstraction struct {implementor Implementor
}func (a *Abstraction) Operation() {a.implementor.Operation()
}// 扩展抽象类
type RefinedAbstraction struct {*Abstraction
}// 客户端
func main() {implA := &ConcreteImplementorA{}implB := &ConcreteImplementorB{}abstraction := &RefinedAbstraction{&Abstraction{implementor: implA}}abstraction.Operation() // 输出: ConcreteImplementorA operationabstraction = &RefinedAbstraction{&Abstraction{implementor: implB}}abstraction.Operation() // 输出: ConcreteImplementorB operation
}

4. 总结

桥接模式 是一种结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过组合而不是继承来达到解耦的目的,从而提高系统的灵活性和可扩展性。

主要优点
  1. 分离抽象和实现桥接模式将抽象部分与实现部分分离,使得两者可以独立变化,提高了系统的灵活性和可扩展性。
  2. 减少子类数量:通过组合而不是继承,减少了子类的数量,简化了类层次结构。
  3. 提高可维护性:由于抽象和实现是分离的,因此可以独立地修改和扩展,降低了代码的维护成本。
主要缺点
  1. 增加了系统的复杂性桥接模式引入了更多的类,增加了系统的复杂性。
  2. 理解难度增加:对于不熟悉桥接模式的开发者来说,理解和使用桥接模式可能会有一定的难度。
适用场景
  • 当一个类存在多种变体,而这些变体需要独立变化时。
  • 当不希望使用继承的方式进行扩展,因为这会导致子类数量激增,且难以管理时。
  • 当需要在运行时动态地选择或切换实现时。

http://www.ppmy.cn/server/145261.html

相关文章

【小白学机器学习34】用python进行基础的数据统计 mean,var,std,median,mode ,四分位数等

目录 1 用 numpy 快速求数组的各种统计量&#xff1a;mean, var, std 1.1 数据准备 1.2 直接用np的公式求解 1.3 注意问题 1.4 用print() 输出内容&#xff0c;显示效果 2 为了验证公式的后背&#xff0c;下面是详细的展开公式的求法 2.1 均值mean的详细 2.2 方差var的…

AIGC--AIGC与人机协作:新的创作模式

AIGC与人机协作&#xff1a;新的创作模式 引言 人工智能生成内容&#xff08;AIGC&#xff09;正在以惊人的速度渗透到创作的各个领域。从生成文本、音乐、到图像和视频&#xff0c;AIGC使得创作过程变得更加快捷和高效。然而&#xff0c;AIGC并非完全取代了人类的创作角色&am…

高性能 ArkUI 应用开发:复杂 UI 场景中的内存管理与 XML 优化

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。 主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。 本文为原创内容,任何形式的转载必须注明出处及原作者。 在开发高性能 ArkUI 应…

Spring |(五)IoC/DI的注解开发

文章目录 &#x1f4da;核心容器&#x1f407;环境准备&#x1f407;容器的创建方式&#x1f407;bean的三种获取方式&#x1f407;BeanFactory的使用 &#x1f4da;IoC/DI注解开发&#x1f407;环境准备&#x1f407;注解开发定义bean&#x1f407;纯注解开发模式&#x1f407…

uniapp-vue2引用了vue-inset-loader插件编译小程序报错

报错信息 Error: Vue packages version mismatch: - vue3.2.45 (D:\qjy-myApp\admin-app\node_modules\vue\index.js) - vue-template-compiler2.7.16 (D:\qjy-myApp\admin-app\node_modules\vue-template-compiler\package.json) This may cause things to work incorrectly.…

力扣 53. 最大子数组和

&#x1f517; https://leetcode.cn/problems/maximum-subarray 题目 给定一个数组&#xff0c;有正数&#xff0c;有复数&#xff0c;返回子序列之和的最大值 思路 这个题目《编程珠玑》讲过&#xff0c;思路从普速的模拟&#xff0c;到 presum 优化&#xff0c;到代码很容…

数字基带传输仿真

基于给定的 “ 升余弦滚降传输误码率测量 ”Simulink 代码&#xff1a; &#xff08; 1 &#xff09;信道加入高斯白噪声&#xff0c;信噪比 SNR[-10,20]dB &#xff1b; &#xff08; 2 &#xff09;使用升余弦发送滤波器和升余弦接收滤波器&#xff1b; &#xff08; 3 …

mysql覆盖索引回表查询

需要的前置知识&#xff1a; 什么是聚簇索引、非聚簇索引、回表查询-CSDN博客 什么是覆盖索引 就是查询的字段是索引里的。打个比方&#xff0c;有个user表&#xff0c;字段为id、name、gender&#xff0c;id是主键&#xff0c;有聚簇索引&#xff0c;name是非聚簇索引。 现在…