四、桥接模式
桥接模式(Bridge Pattern)是一种软件设计模式,它用于将抽象部分与其具体实现部分解耦,使它们可以独立地变化。桥接模式的核心思想是将一个系统分为多个维度,并通过桥接连接这些维度,从而实现更灵活的系统设计。
在桥接模式中,有两个主要的角色:
-
抽象部分(Abstraction):抽象部分定义了系统的高层接口,它包含了抽象方法和引用实现部分的对象。抽象部分通过委派调用实现部分的对象来完成具体的操作。
-
实现部分(Implementor):实现部分定义了抽象部分的具体实现,它提供了具体方法的实现细节。实现部分通常是一个接口或抽象类,它定义了可以由具体实现类来实现的方法。
通过桥接模式,可以实现抽象部分和实现部分的分离,使它们可以独立地变化。这样,在系统需要扩展或修改时,可以在不影响其他部分的情况下对其进行修改。
使用桥接模式的好处包括:
- 解耦:将抽象部分和实现部分分离,使它们可以独立地变化。
- 扩展性:容易添加新的抽象部分和实现部分,扩展系统的功能。
- 可维护性:修改抽象部分或实现部分的代码不会对另一部分产生影响,易于维护。
总之,桥接模式通过将抽象部分和实现部分解耦,提供了一种灵活的设计方式,使系统更加可扩展和可维护。它在许多领域中都有广泛的应用,特别是在需要处理多维度变化的情况下,可以帮助构建更具弹性和可扩展性的软件系统。
概念
对于有两个变化维度(即两个变化的原因)的系统,采用方案2来进行设计系统中类的个数更少,且系统扩展更为方便。
桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化
它是一种对象结构型模式,又称为柄体模式或接口模式
代码
以下是一个简单的桥接模式的代码示例,展示了如何使用桥接模式来实现一个形状(Shape)和颜色(Color)之间的桥接关系:
# 实现部分接口
class Color:
def fill(self):
pass
# 具体实现部分类
class RedColor(Color):
def fill(self):
return "填充红色"
class BlueColor(Color):
def fill(self):
return "填充蓝色"
# 抽象部分接口
class Shape:
def __init__(self, color):
self.color = color
def draw(self):
pass
# 具体抽象部分类
class SquareShape(Shape):
def draw(self):
return f"绘制正方形,{self.color.fill()}"
class CircleShape(Shape):
def draw(self):
return f"绘制圆形,{self.color.fill()}"
# 使用桥接模式
red_color = RedColor()
blue_color = BlueColor()
square_shape = SquareShape(red_color)
print(square_shape.draw()) # 输出:绘制正方形,填充红色
circle_shape = CircleShape(blue_color)
print(circle_shape.draw()) # 输出:绘制圆形,填充蓝色
在上面的示例中,Color
是实现部分接口,RedColor
和 BlueColor
是具体实现部分类。Shape
是抽象部分接口,SquareShape
和 CircleShape
是具体抽象部分类。
通过在抽象部分中包含一个实现部分的对象,将抽象部分和实现部分连接起来。在创建具体抽象部分类的实例时,需要传入一个具体实现部分类的实例作为参数。
通过调用抽象部分的方法,并委托给实现部分的对象来完成具体的操作。这样,在不改变抽象部分和实现部分的代码的情况下,可以通过更换具体实现部分类的实例,来改变系统的行为。
在上述示例中,SquareShape
和 CircleShape
分别绘制正方形和圆形,并通过 color.fill()
调用委托给具体实现部分类的 fill()
方法来填充颜色。
这个示例展示了桥接模式的基本思想和结构,它通过将抽象部分和实现部分解耦,使得它们可以独立地变化和扩展。通过桥接模式,可以更灵活地设计和组织系统,使得系统具有更好的可扩展性和可维护性。
实例一:自动茶水销售机
实例二:不同度量的体积计算问题
实例三:跨平台视频播放器
优缺点
优点:
满足开闭原则
- 分离抽象接口及其实现部分。
- 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
- 实现细节对客户透明,可以对用户隐藏实现细节。
缺点:
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
使用环境
- 需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系
- 抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响
- 存在两个独立变化的维度
- 不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统
关于桥接模式的讨论
适配器模式与桥接模式的联用
桥接模式用于系统的初步设计,当发现系统与已有类无法协同工作时,可以采用适配器模式
课程作业
行为型软件设计模式
概述
动机
行为型软件设计模式关心算法和对象之间的责任分配,不仅是描述对象或类模式,更加侧重描述它们之间的通信模式
内容
迭代器模式抽象了访问和遍历一个集合中的对象的方式
访问者模式封装了分布于多个类之间的行为
中介者模式通过在对象间引入一个中介对象,避免对象间的显式引用
策略模式将算法封装在对象中,这样可以方便指定或改变一个对象使用的算法
状态模式封装了兑现过的状态,使得当对象的状态发生变化时,该对象可以改变自身的行为