Python设计模式-桥接模式
来源:互联网 发布:八百字淘宝导购 编辑:程序博客网 时间:2024/05/22 01:02
Python设计模式-桥接模式
基于Python3.5.2,代码如下
#coding:utf-8class Shape(): name = "" param = "" def __init__(self,*param): pass def getName(self): return self.name def getParam(self): return self.name,self.paramclass Pen(): shape = "" type = "" def __init__(self,shape): self.shape = shape def draw(self): passclass Rectangle(Shape): def __init__(self,long,width): self.name = "Rectangle" self.param = "Long:%s Width:%s"%(long,width)class Circle(Shape): def __init__(self,radius): self.name = "Circle" self.param = "Radius :%s"%(radius)class NormalPen(Pen): def __init__(self,shape): Pen.__init__(self,shape) self.type = "Normal Line" def draw(self): print("draw ",self.type,self.shape.getName(),self.shape.getParam())class BrushPen(Pen): def __init__(self, shape): Pen.__init__(self, shape) self.type = "BrushPen Line" def draw(self): print("draw ", self.type, self.shape.getName(), self.shape.getParam())if __name__ == "__main__": rect = Rectangle("10","20") cir = Circle("15") n = NormalPen(rect) n.draw() n1 = NormalPen(cir) n1.draw() b = BrushPen(rect) b.draw()
桥接模式分析与解读
桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立变化。在桥接模式的基础是建立在合成/聚合复用原则(CARP),尽量使用合成/聚合。聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。例如,人的眼睛和人是部分和整体的关系,并且两者拥有同样的生命周期,所以就属于合成关系;一群皮皮虾里,每只皮皮虾都属于虾群,一个虾群拥有多只皮皮虾,所以皮皮虾对应虾群就是聚合关系。这里对类的继承进行说明,对象的继承关系是在编译时就定义好了,所以无法再运行时改变从父类继承的实现,子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然导致子类发生变化,当你需要复用子类时,如果继承下来的实现不合适解决新的问题,则父类必须重写或被其他更合适的类替换,这种依赖关系限制了灵活性并最终限制了复用性。在桥接模式下,就是将两个类进行聚合,使两个类分别实现,而不进行继承实现。
桥接模式的适用场景
1、不适用继承或者原继承关系中抽象类可能频繁变动的情况,可以将原类进行拆分,拆成实现花角色和抽象化角色;2、重用性比较大的场景。比如开关控制逻辑的程序,开关就是抽象画角色,开关的形式有很多种,操作的实现化角色有很多种。
解读
代码中,分别定义了形状类(Shape)和画笔类(Pen),然后通过各自父类进行继承实现:1、定义了Shape的子类Rectangle和Circle,分别定义相应参数;2、定义了Pen的子类NormalPen和BrushPen,并在初始化的时候传入对应的Shape类,分别实现不同的draw()方法,来实现与Shpae类对象进行关联;3、在客户端调用时,先生成对应的Shape类,然后将生成的Shape类在Pen类初始化的时候传入,再调用draw()方法,来实现不同形状的draw;
程序运行结果如下:
draw Normal Line Rectangle (‘Rectangle’, ‘Long:10 Width:20’)
draw Normal Line Circle (‘Circle’, ‘Radius :15’)
draw BrushPen Line Rectangle (‘Rectangle’, ‘Long:10 Width:20’)
通过运行结果,当传入不同的形状类型时,绘制了不同的形状,如果需要新增Shape类型,只需要继承Shape类,然后实现相应方法,符合对扩展开发,对修改封闭原则。
桥接模式的优缺点
优点:
1、抽象角色与实现角色相分离,二者可以独立设计,不受约束;2、扩展性强:抽象角色和实现角色可以非常灵活地扩展。
缺点:
1、增加对系统理解的难度。
备注
# 接口实现类class Implementor: def Operation(self): raise NotImplementedErrorclass ConcreteImplementorA(Implementor): def Operation(self): print("实现 A的方法")class ConcreteImplementorB(Implementor): def Operation(self): print("实现 B的方法")# 抽象类class Abstraction(): def __init__(self,implementor): self.implementor = implementor def Operation(self): raise NotImplementedErrorclass RefineAbstraction(Abstraction): def Operation(self): self.implementor.Operation()if __name__ == "__main__": a = ConcreteImplementorA() b = ConcreteImplementorB() aa = RefineAbstraction(a) ab = RefineAbstraction(b) aa.Operation() ab.Operation()
该实现方法更适合不同语言的通用方法。
阅读全文
0 0
- python设计模式之桥接模式
- Python设计模式(四)【桥接模式】
- Python设计模式-桥接模式
- python设计模式之桥接模式
- 设计模式十一(桥接模式,python 语言实现)
- Python设计模式——桥接模式
- Python的结构型设计模式之桥接模式
- 设计模式之桥接模式Python实现
- python设计模(桥接模式)
- 设计模式----桥接模式
- 设计模式---桥接模式
- 设计模式:桥接模式
- 设计模式 桥接模式
- 设计模式 - 桥接模式
- 设计模式--桥接模式
- 设计模式--桥接模式
- 设计模式 - 桥接模式
- 设计模式-桥接模式
- 数据库日期函数
- 数据结构--用C语言描述 耿国华 期末试题
- WebSocket 和 Socket 的区别
- 数据结构排序算法
- 整数与字符串互转
- Python设计模式-桥接模式
- 20170623
- C语言实现简易网络进程及线程间通信
- 数袋鼠好有趣
- 根据bootmode设置usb的config(for Android)
- Appium之Appium1.6.x 安装配置及问题资料汇总
- MDM USB How-to
- android增删改查以及通知栏和定时任务简单的实现
- 修改pip install时,默认的安装源