在现实生活中,某些类具备两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计相似于 Photoshop 这样的软件,能画不一样形状和不一样颜色的图形呢?若是用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类不少,并且扩展困难。python
固然,这样的例子还有不少,如不一样颜色和字体的文字、不一样品牌和功率的汽车、不一样性别和职业的男女、支持不一样平台和不一样文件格式的媒体播放器等。若是用桥接模式就能很好地解决这些问题。编程
桥接(Bridge)模式的定义以下:将抽象与实现分离,使它们能够独立变化。它是用组合关系代替继承关系来实现,从而下降了抽象和实现这两个可变维度的耦合度。字体
桥接(Bridge)模式的优势是:spa
缺点是:因为聚合关系创建在抽象层,要求开发者针对抽象化进行设计与编程,这增长了系统的理解与设计难度。设计
能够将抽象化部分与实现化部分分开,取消两者的继承关系,改用组合关系。code
桥接(Bridge)模式包含如下主要角色。对象
class Implemter(object): def OperatiomImpl(self): pass class ConcreteImplementA(Implemter): def OperatiomImpl(self): print('ConcreteImplement A') class ConcreteImplementB(Implemter): def OperatiomImpl(self): print('ConcreteImplement B') class Abstraction(object): _imple = None def __init__(self, imple): self._imple = imple def operation(self): pass class RefinedAbstrcation(Abstraction): def __init__(self, imple): super().__init__(imple) def operation(self): print('扩展抽象化(Refined Abstraction)角色被访问') self._imple.OperatiomImpl() if __name__ == '__main__': imple = ConcreteImplementA() abs = RefinedAbstrcation(imple) abs.operation()
用桥接(Bridge)模式模拟女士皮包的选购。blog
分析:女士皮包有不少种,能够按用途分、按皮质分、按品牌分、按颜色分、按大小分等,存在多个维度的变化,因此采用桥接模式来实现女士皮包的选购比较合适。继承
本实例按用途分可选钱包(Wallet)和挎包(HandBag),按颜色分可选黄色(Yellow)和红色(Red)。能够按两个维度定义为颜色类和包类。接口
class Color(object): def get_color(self): pass class Yellow(Color): def get_color(self): return "黄色" class Red(Color): def get_color(self): return '红色' class Bag(object): _color = None def set_color(self, color): self._color = color def get_name(self): pass class HandBag(Bag): def get_name(self): print(self._color.get_color(), "挎包") class Wallet(Bag): def get_name(self): print(self._color.get_color(), "钱包") if __name__ == '__main__': y = Yellow() r = Red() hb = HandBag() hb.set_color(y) hb.get_name()
桥接模式一般适用于如下场景。
在软件开发中,有时桥接(Bridge)模式可与适配器模式联合使用。当桥接(Bridge)模式的实现化角色的接口与现有类的接口不一致时,能够在两者中间定义一个适配器将两者链接起来,其具体结构图如图所示。