Skip to content

设计模式之桥模式

机会只对进取者开放。

Author: 李东阳

1、什么是桥模式

内容

将一个事物的两个维度(将抽象部分与实现部分)分离,使其都可以独立地变化。

角色

  • 抽象者(Abstraction)

  • 细化抽象者(Refined Abstraction)

  • 实现者(Implementor)

  • 具体实现者(Concrete Implementor)

应用场景

当事务有两个维度上的表现,两个维度都可能扩展时

2、桥模式的实现

桥模式的内容就是:将一个事物的两个维度分离,使其都可以独立地变化。举个例子:我们知道,一个事物都是有多个维度的。就比如说是图形,有长方形、圆形、三角形,这是形状维度。还有红色、绿色、蓝色,这是颜色维度。

假设,我们现在要用python绘制不同形状和颜色的图形,那么我们就是可以用到桥模式。

没有用到桥模式:

class Shape:
    pass

class Triangle(Shape):
    pass

class Rectangle(Shape):
    pass

class Circle(Shape):
    pass

class RedTriangle(Triangle):
    pass

class GreenTriangle(Triangle):
    pass

class BlueTriangle(Triangle):
    pass

class RedRectangle(Rectangle):
    pass

class GreeRectangle(Rectangle):
    pass

class BlueRectangel(Rectangle):
    pass

class RedCircle(Circle):
    pass

class GreenCircle(Circle):
    pass

class BlueCircle(Circle):
    pass

这样写的缺点很明显,就是每当多写一个具体形状类时,就需要多些更多的颜色形状类。

使用桥模式实现:

from abc import ABCMeta,abstractmethod

# 抽象者
class Shape(metaclass=ABCMeta):  # 抽象接口
    def __init__(self,color):  # 需要传入一个颜色对象
        self.color=color
    @abstractmethod
    def draw(self):  # 画形状方法
        pass

# 实现者
class Color(metaclass=ABCMeta):  抽象接口
    @abstractmethod
    def paint(self,shape):  # 填涂颜色方法
        pass

# 具体实现者
class Red(Color):
    def paint(self,shape):
        print(f"红色的{shape.name}")

class Green(Color):
    def paint(self,shape):
        print(f"绿色的{shape.name}")

class Blue(Color):
    def paint(self,shape):
        print(f"蓝色的{shape.name}")

# 细化抽象者
class Rectangle(Shape):
    name="长方形"
    def draw(self):
        print("绘制长方形的形状中...")
        self.color.paint(self)  # 调用颜色填涂方法,并将形状本身传入

class Circle(Shape):
    name="圆形"
    def draw(self):
        print("绘制圆形的形状中...")
        self.color.paint(self)

class Triangle(Shape):
    name="三角形"
    def draw(self):
        print("绘制三角形的形状中...")
        self.color.paint(self)

if __name__=="__main__":
    shap1=Rectangle(Red())
    shap1.draw()

    shap2=Circle(Blue())
    shap2.draw()

    shap3=Triangle(Green())
    shap3.draw()

# 输出:
绘制长方形的形状中...
红色的长方形
绘制圆形的形状中...
蓝色的圆形
绘制三角形的形状中...
绿色的三角形

优点:

抽象和实现相分离,降低耦合

优秀的扩展能力

缺点:

系统可读性降低