漫谈设计模式 [7]:桥接模式

引导性开场

菜鸟:老鸟,我最近在开发一个图形库,要支持多种形状和不同的颜色。每种形状都有多种颜色变种,代码变得越来越复杂。每次添加一种新形状或颜色时,我都得修改很多地方,感觉很麻烦,有没有什么好的设计模式可以解决这个问题?

老鸟:听起来你遇到了扩展性和维护性的问题。你有没有听说过桥接模式(Bridge Pattern)?

菜鸟:桥接模式?没听过。能给我讲讲吗?

渐进式介绍概念

老鸟:当然。你可以把桥接模式看作是将抽象部分与其实现部分分离,使它们可以独立地变化。简单来说,就是让形状和颜色这两个概念独立开来,这样你就不会因为增加一种形状或颜色而修改大量代码。

菜鸟:有点抽象,能不能举个例子?

老鸟:好比你有一张桌子和几种颜色的油漆。你可以给桌子刷不同的颜色,但你不会因为要增加一种新颜色而去重新制作桌子,对吧?

菜鸟:嗯,有点明白了。

Python代码示例,逐步展开

老鸟:我们先从简单的实现开始。假设我们有两个形状:圆形和方形,每个形状都有红色和蓝色两种颜色。

python 复制代码
class Circle:
    def __init__(self, color):
        self.color = color
    
    def draw(self):
        print(f"Drawing a {self.color} circle")

class Square:
    def __init__(self, color):
        self.color = color
    
    def draw(self):
        print(f"Drawing a {self.color} square")
        
# 使用示例
circle = Circle("red")
circle.draw()

square = Square("blue")
square.draw()

菜鸟:这样看起来还行,但如果我需要增加一个绿色的形状呢?

老鸟:你需要修改每个形状类去支持绿色,这样代码就会变得更加复杂。现在我们使用桥接模式来改进它。

python 复制代码
# 颜色实现类
class Color:
    def apply_color(self):
        pass

class Red(Color):
    def apply_color(self):
        print("Applying red color")

class Blue(Color):
    def apply_color(self):
        print("Applying blue color")

# 形状抽象类
class Shape:
    def __init__(self, color):
        self.color = color

    def draw(self):
        pass

class Circle(Shape):
    def draw(self):
        print("Drawing a circle")
        self.color.apply_color()

class Square(Shape):
    def draw(self):
        print("Drawing a square")
        self.color.apply_color()

# 使用示例
red = Red()
blue = Blue()

circle = Circle(red)
circle.draw()

square = Square(blue)
square.draw()

菜鸟:看起来清晰多了!这样如果我再增加一种绿色,只需要增加一个新的颜色类就行了,对吧?

老鸟:没错,形状和颜色独立开来,增加一种新颜色或新形状都不会影响到对方。

问题与反思

菜鸟:这样的话,如果我需要增加一个新的形状,比如三角形,该怎么做?

老鸟:你只需要增加一个新的形状类即可。比如:

python 复制代码
class Triangle(Shape):
    def draw(self):
        print("Drawing a triangle")
        self.color.apply_color()

# 使用示例
green = Green()

triangle = Triangle(green)
triangle.draw()

菜鸟:原来如此!这样就不会因为增加功能而修改已有的代码,减少了出错的概率。

优势与适用场景

老鸟:桥接模式的优势在于它将抽象部分和实现部分分离,减少了它们之间的耦合,使得系统更具可扩展性和灵活性。适用于那些需要在多个维度上扩展的系统,比如图形库中的形状和颜色。

菜鸟:那除了图形库,还有哪些场景适合使用桥接模式?

老鸟:比如,在图形用户界面(GUI)开发中,窗口和操作系统平台可以使用桥接模式。不同的窗口类型和操作系统平台之间可以独立变化。

常见误区与优化建议

菜鸟:听起来桥接模式很有用,但有没有什么常见的误区需要注意?

老鸟:使用桥接模式时,要注意不要滥用。并不是所有的多维度变化都需要使用桥接模式。有时简单的继承关系已经足够。如果维度过多,桥接模式可能会带来复杂性。

总结与延伸阅读

老鸟:今天我们讨论了桥接模式,通过将形状和颜色独立开来,使得它们可以独立变化,减少了系统的耦合性,增加了灵活性。你可以参考《设计模式:可复用面向对象软件的基础》这本书,里面有详细的桥接模式介绍。

菜鸟:谢谢老鸟,我觉得今天学到了很多!下一步我想学习其他设计模式,你有什么推荐的吗?

老鸟:可以学习一下策略模式(Strategy Pattern),它也是一种非常常用的设计模式,特别适合用在算法的选择和管理上。

菜鸟:好的,我会去研究策略模式的,谢谢你!

老鸟:不客气,有问题随时来找我。

相关推荐
databook1 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar3 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780513 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_3 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
晨米酱5 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机10 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机11 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机11 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机11 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i11 小时前
drf初步梳理
python·django