设计模式-创结构型模式,python 桥接模式

桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。

介绍

意图:将抽象部分与实现部分分离,使它们都可以独立的变化。

主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

关键代码:抽象类依赖实现类。

应用实例: 1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。 2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。

优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。

缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。

class RedCircle:
    def draw_circle(self, radius, x, y):
        print("Drawing Circle[ color: red, radius: " + str(radius) + ", x: " + str(x) + ",y: " + str(y) + "]")


class GreenCircle:
    def draw_circle(self, radius, x, y):
        print("Drawing Circle[ color: green, radius: " + str(radius) + ", x: " + str(x) + ",y: " + str(y) + "]")


class Circle:
    def __init__(self, x, y, radius, draw_api):
        self.__x = x
        self.__y = y
        self.__radius = radius
        self._draw_api = draw_api

    def draw(self):
        self._draw_api.draw_circle(self.__radius, self.__x, self.__y)


if __name__ == '__main__':
    red_circle = Circle(100, 100, 10, RedCircle())
    green_circle = Circle(100, 100, 10, GreenCircle())
    red_circle.draw()
    green_circle.draw()

1、这是从菜鸟教程的http://www.runoob.com/design-pattern/bridge-pattern.html java设计模式桥接模式转化来的,比java少些了很多行很多个类,是因为使用了鸭子类,去掉了一切接口 和抽象基类,代码是少了,但是意图没有java那种原版清晰。在看python设计模式的时候一定要对多个类中有同种名称的方法十分敏感,因为往往有些关键东西就在这里。这里是转换java时候为了少敲几行用的鸭子类,如果是我项目写的话,我不会使用鸭子类这种形式,虽然少了好几个类,但可读意图就差了些。

2、另外说一下,就是为什么有些属性我加了下划线,通常来讲,我都是独立作战,基本不会有多人配合的情况,因为其他人都是只会纯函数编程,不使用类和对象,就算不写私有、保护,我自己也不会去修改这些属性的,写下划线的原因好处是在pycahrm方法提示自动补全时候,不会弹出一些没用的玩意,这些东西几乎不需要使用对象来单独访问它,提示它干鸟。

3、这里也可以使用mixin类继承,继承谁是写死的,组合谁是动态的。如果圆的颜色太多了,动态组合肯定好,代码少一些。

4、还是老生常谈,一切设计模式无非是类模式和对象模式,即继承和组合。就算不专门看设计模式,自己有可能曾经想出来也用过了,但是不专门看,有可能是一瞬间的凌乱感迸发,不能形成持久的稳定输出。

5、如果这么写的桥接模式和策略模式哪有啥区别?主要是例子没举好,应该再加一个类正方形,应该是绿色圆 红色圆 绿色正方形 红色长方形,最起码两种形状 两种颜色,才能看出区别。这个例子更合适https://blog.csdn.net/u012984054/article/details/52216347

猜你喜欢

转载自www.cnblogs.com/ydf0509/p/9652330.html