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

ops/2024/11/28 4:23:29/

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/ops/137253.html

相关文章

ArcGIS 10.2软件安装包下载及安装教程!

今日资源&#xff1a;ArcGIS 适用系统&#xff1a;WINDOWS 软件介绍&#xff1a;ArcGIS是一款专业的电子地图信息编辑和开发软件&#xff0c;提供一种快速并且使用简单的方式浏览地理信息&#xff0c;无论是2D还是3D的信息。软件内置多种编辑工具&#xff0c;可以轻松的完成地…

上天入地 灵途科技光电技术赋能空间感知

近来&#xff0c;人工智能技术频频亮相各大马拉松赛事&#xff0c;成为引人注目的科技亮点。 11月3日&#xff0c;杭州马拉松首次启用了机器狗作为配速员&#xff0c;以稳定的节奏为选手提供科学的跑步节奏。 11月11日&#xff0c;亦庄半程马拉松的终点处&#xff0c;人形机器…

微信小程序:实现定时拍照与自动上传功能攻略——静音版

在之前的文章中&#xff0c;我介绍过可以用ctx.takePhoto来实现定时拍照&#xff0c;但是在实际使用过程中&#xff0c;会有快门声&#xff0c;影响用户体验感&#xff0c;本文中&#xff0c;我们将介绍如何在微信小程序中实现静音定时拍照功能&#xff0c;并将拍摄的照片上传到…

Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch中的节点&#xff08;比如共20个&#xff09;&#xff0c;其中的10个选了一个master&#xff0c;另外10个选了另一个master&#xff0c;怎么办&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch中的节…

基于Java Springboot点餐系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

阿里Qwen系列开源模型介绍

模型种类丰富 Qwen2&#xff1a;包含Qwen2-0.5b、Qwen2-1.5b、Qwen2-7b、Qwen2-57b-a14b以及Qwen2-72b等五种规模的预训练和指令微调模型&#xff0c;其在多语言处理、长文本处理、代码生成、数学和逻辑推理等能力上&#xff0c;在mmlu、gpqa、humaneval等国际测评中得到了验证…

NLP 1、人工智能与NLP简介

人人都不看好你&#xff0c;可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg&#xff1a;特定场景下的文本分类、垂直领域下的对…

前端css绝对位置相关知识点

前端中的 绝对定位&#xff08;position: absolute&#xff09;是一个非常常用的布局方式&#xff0c;它可以让一个元素相对于最近的定位父元素进行定位&#xff08;不是相对于页面的默认位置&#xff09;。这里是关于 绝对定位 的一些关键知识点。 1. position: absolute 的基…