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

devtools/2024/11/27 18:05:22/

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/devtools/137456.html

相关文章

Edge浏览器保留数据,无损降级退回老版本+禁止更新教程(适用于Chrome)

3 个月前阿虚就已经写文章告警过大家&#xff0c;Chromium 内核的浏览器将在 127 以上版本开始限制仍在使用 Manifest V2 规范的扩展&#xff1a;https://mp.weixin.qq.com/s/v1gINxg5vMh86kdOOmqc6A 像是 IDM、油猴脚本管理器、uBblock 等扩展都会受到影响&#xff0c;后续将无…

深度学习中的卷积神经网络:原理、结构与应用

&#x1f35e;引言 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNNs&#xff09;是深度学习领域中的一类经典神经网络结构&#xff0c;尤其在图像识别、语音识别等任务中得到了广泛的应用。CNN通过模仿生物视觉系统处理信息的方式&#xff0c;能够高效…

无人机:智能航点规划技术!

一、核心技术 环境感知技术 环境感知是智能航点规划的基础&#xff0c;通过传感器&#xff08;如雷达、摄像头、激光雷达等&#xff09;实时收集飞行环境的信息&#xff0c;包括地形、障碍物、天气等。 这些信息被用于构建飞行环境的数字模型&#xff0c;为后续的航点规划提…

Python学习34天

import random class Game: peo0 rob0 # # def __init__(self,peo,rob): # self.peopeo # self.robrob def Play(self): """ 石头剪刀布游戏&#xff0c;0代表石头&#xff0c;1代见到&#xff0c;2代表石头 …

Flume 与 Kafka 整合实战

目录 一、Kafka 作为 Source【数据进入到kafka中&#xff0c;抽取出来】 &#xff08;一&#xff09;环境准备与配置文件创建 &#xff08;二&#xff09;创建主题 &#xff08;三&#xff09;测试步骤 二、Kafka 作为 Sink数据从别的地方抽取到kafka里面】 &#xff08;…

腾讯云OCR车牌识别实践:从图片上传到车牌识别

在当今智能化和自动化的浪潮中&#xff0c;车牌识别&#xff08;LPR&#xff09;技术已经广泛应用于交通管理、智能停车、自动收费等多个场景。腾讯云OCR车牌识别服务凭借其高效、精准的识别能力&#xff0c;为开发者提供了强大的技术支持。本文将介绍如何利用腾讯云OCR车牌识别…

java基础知识(Math类)

引入&#xff1a;Math 类包含用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根 import java.util.Math 1.abs绝对值 int abs Math.abs(-9); 2.pow求幂 double pow Math.pow(2,4); 3.向上取整 double ceil Math.ceil(3.9);//ceil 4 4.向下取整 dou…

03-07、SpringCloud第七章,升级篇,服务注册与发现Eureka、Zookeeper和Consule

SpringCloud第七章&#xff0c;升级篇&#xff0c;服务注册与发现Eureka、Zookeeper和Consule 一、基础概念 1、服务治理 传统的远程RPC远程调用框架中&#xff0c;管理每个服务与服务之间的依赖关系比较复杂。所以需要使用服务治理&#xff0c;用于管理服务与服 务之间的依…