Python与设计模式--桥梁模式

23种计模式之 前言 +(5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、+(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、+(11)策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 + 设计原则

11-Python与设计模式–桥梁模式

一、画笔与形状

在介绍原型模式的一节中,我们举了个图层的例子,这一小节内容,我们同样以类似画图的例子,
说明一种结构类设计模式:桥梁模式。
在一个画图程序中,常会见到这样的情况:有一些预设的图形,如矩形、圆形等,还有一个对象-画笔,
调节画笔的类型(如画笔还是画刷,还是毛笔效果等)并设定参数(如颜色、线宽等),选定图形,
就可以在画布上画出想要的图形了。要实现以上需求,先从最抽象的元素开始设计,
即形状和画笔(暂时忽略画布,同时忽略画笔参数,只考虑画笔类型)。
class Shape:
    name=""
    param=""
    def __init__(self,*param):
        pass
    def getName(self):
        return self.name
    def getParam(self):
        return self.name,self.param

class Pen:
    shape=""
    type=""
    def __init__(self,shape):
        self.shape=shape
    def draw(self):
        pass

形状对象和画笔对象是最为抽象的形式。接下来,构造多个形状,如矩形和圆形:

class Rectangle(Shape):
    def __init__(self,long,width):
        self.name="Rectangle"
        self.param="Long:%s Width:%s"%(long,width)
        print "Create a rectangle:%s"%self.param
class Circle(Shape):
    def __init__(self,radius):
        self.name="Circle"
        self.param="Radius:%s"%radius
        print "Create a circle:%s"%self.param

紧接着是构造多种画笔,如普通画笔和画刷:

class NormalPen(Pen):
    def __init__(self,shape):
        Pen.__init__(self,shape)
        self.type="Normal Line"
    def draw(self):
        print "DRAWING %s:%s----PARAMS:%s"%(self.type,self.shape.getName(),self.shape.getParam())
class BrushPen(Pen):
    def __init__(self,shape):
        Pen.__init__(self,shape)
        self.type="Brush Line"
    def draw(self):
        print "DRAWING %s:%s----PARAMS:%s" % (self.type,self.shape.getName(), self.shape.getParam())

业务中的逻辑如下:

if __name__=="__main__":
    normal_pen=NormalPen(Rectangle("20cm","10cm"))
    brush_pen=BrushPen(Circle("15cm"))
    normal_pen.draw()
    brush_pen.draw()

打印如下:

Create a rectangle:Long:20cm Width:10cm Create a circle:Radius:15cm
DRAWING Normal Line:Rectangle----PARAMS:(‘Rectangle’, ‘Long:20cm
Width10cm’) DRAWING Brush Line:Circle----PARAMS:(‘Circle’,
‘Radius:15cm’)

二、桥梁模式

桥梁模式又叫桥接模式,定义如下:将抽象与实现解耦(注意此处的抽象和实现,并非抽象类和实现类的那种
关系,而是一种角色的关系,这里需要好好区分一下),可以使其独立变化。在形如上例中,Pen只负责画,
但没有形状,它终究是不知道要画什么的,所以我们把它叫做抽象化角色;而Shape是具体的形状,我们把它
叫做实现化角色。抽象化角色和实现化角色是解耦的,这也就意味着,所谓的桥,就是抽象化角色的抽象类和
实现化角色的抽象类之间的引用关系。

三、桥梁模式的优点和应用场景

优点:
1、抽象角色与实现角色相分离,二者可以独立设计,不受约束;
2、扩展性强:抽象角色和实现角色可以非常灵活地扩展。

应用场景:
1、不适用继承或者原继承关系中抽象类可能频繁变动的情况,可以将原类进行拆分,拆成实现化角色和抽象化角色。例如本例中,若将形状、粗细、绘画样式等属于汇集在一个类中,一旦抽象类中有所变动,将造成巨大的风险;
2、重用性比较大的场景。比如开关控制逻辑的程序,开关就是抽象化角色,开关的形式有很多种,操作的实现化角色也有很多种,采用桥梁模式,(如当前例子)开关即可进行复用,整体会将设计的粒度减小。

四、桥梁模式的缺点

1、增加对系统理解的难度。
  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python设计模式是一种用于解决特定问题的可重复使用的解决方案。在Python中,有许多常见的设计模式,如单例模式、工厂模式、观察者模式等。这些设计模式可以帮助开发人员更好地组织和管理代码,提高代码的可维护性和可扩展性。 在引用\[1\]中,我们介绍了桥梁模式,它是一种结构类设计模式桥梁模式可以用于解耦抽象和实现部分,使它们可以独立地变化。在一个画图程序中,桥梁模式可以用于将图形和画笔进行解耦,使它们可以独立地变化。通过桥梁模式,我们可以定义不同类型的画笔,并将其与不同的图形进行组合,从而实现不同类型的图形绘制。 在引用\[2\]中,我们展示了如何使用桥梁模式来构造多种画笔。通过继承和重写父类的方法,我们可以定义不同类型的画笔,如普通画笔和画刷。每种画笔都有自己的绘制方法,并可以接受不同类型的图形作为参数进行绘制。 在引用\[3\]中,我们提到了Python原生不支持静态分派,但可以通过访问者模式实现一种基于类的“双分派效果”。访问者模式是一种行为类设计模式,它可以在运行时根据对象的类型动态选择方法的调用。通过访问者模式,我们可以实现多分派,即根据两个对象的类型选择不同的方法进行调用。 总之,Python设计模式是一种用于解决特定问题的可重复使用的解决方案。在Python中,有许多常见的设计模式,如桥梁模式、访问者模式等,它们可以帮助开发人员更好地组织和管理代码。 #### 引用[.reference_title] - *1* *2* *3* [Python的23种设计模式(完整版带源码实例)](https://blog.csdn.net/huangbangqing12/article/details/128655980)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值