设计模式之桥模式¶
机会只对进取者开放。
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()
# 输出:
绘制长方形的形状中...
红色的长方形
绘制圆形的形状中...
蓝色的圆形
绘制三角形的形状中...
绿色的三角形
优点:
抽象和实现相分离,降低耦合
优秀的扩展能力
缺点:
系统可读性降低