首页 > 编程语言 >Python实现软件设计模式8:桥接模式 Bridge Pattern

Python实现软件设计模式8:桥接模式 Bridge Pattern

时间:2024-01-11 13:01:21浏览次数:39  
标签:Bridge name 桥接 self 模式 def str class penType

动机

将抽象部分与实现部分分离,使他们都可以独立地变化。用抽象关联取代传统的多层继承。将类之间的静态继承关系转换为动态的对象组合关系。

上图展示的软件系统中存在两个独立地变化维度,分别是抽象类(Abstraction)和实现类(Implementor),它俩都是接口、都分别可以独立地扩展出多个子类。抽象类中关联(委派)一个实现类对象。作为区分,通常让将宏大的、公共的类作为抽象类,将细粒度的、容易重用的类作为实现类。

主要角色

  • Abstraction 抽象类接口
  • RefinedAbstractionA\B\C 扩展抽象类
  • Implementor 实现类接口
  • ConcreteImplementorA\B\C 具体实现类
  • Client 客户端

案例

以蜡笔和毛笔绘画进行举例,蜡笔把颜色和尺寸型号两个变化维度耦合在一起,毛笔将颜色和型号实现了分离,增加新的颜色或尺寸型号对另一方面没有任何影响。

对于每一只毛笔,大小是固定的,但是颜色是可以变化选择的,因此将毛笔的尺寸型号定义在抽象部分中,将颜色属性声明、定义在实现部分中。

Python代码

from abc import ABC,abstractmethod
import typing

class Color(ABC):   # 抽象类
    @abstractmethod # 笔类型、图形类型
    def bepaint(self, penType : str, name : str):
        pass

class Black(Color):
    def bepaint(self, penType: str, name: str):
        print(f"{penType} 黑色的 {name}.")

class Blue(Color):
    def bepaint(self, penType: str, name: str):
        print(f"{penType} 蓝色的 {name}.")

class Green(Color):
    def bepaint(self, penType: str, name: str):
        print(f"{penType} 绿色的 {name}.")

class Red(Color):
    def bepaint(self, penType: str, name: str):
        print(f"{penType} 红色的 {name}.")

class Yellow(Color):
    def bepaint(self, penType: str, name: str):
        print(f"{penType} 黄色的 {name}.")


class Pen(ABC):
    def __init__(self):
        self._color = None
    
    def setColor(self, color):
        self._color = color
    
    @abstractmethod
    def draw(self, name):
        pass

class BigPen(Pen):
    def draw(self, name):
        penType = "大号毛笔绘制"
        self._color.bepaint(penType, name)

class MiddlePen(Pen):
    def draw(self, name):
        penType = "中号毛笔绘制"
        self._color.bepaint(penType, name)

class SmallPen(Pen):
    def draw(self, name):
        penType = "小号毛笔绘制"
        self._color.bepaint(penType, name)
    
class Client:
    def __init__(self, col: str, pen:  str):  # 用户注入毛笔的 颜色 和 尺寸型号
        self.Color  = eval(col)()
        self.PenType = eval(pen)()
        try:
            self.Color  = eval(col)()
        except NameError:
            print("Error! 所指定颜色不存在!")
        
        try:
            self.PenType = eval(pen)()
        except NameError:
            print("Error! 所指定毛笔类型不存在!")

    def run(self, shape:str):  # 指定绘制的图案或形状
        self.PenType.setColor(self.Color)
        self.PenType.draw(shape)

if __name__ == '__main__':
    c1 = Client(col = 'Red', pen = 'SmallPen')
    c1.run('乌龟')

    c2 = Client(col = 'Blue', pen = 'MiddlePen')
    c2.run('飞机')

总结

优点

  • 分离抽象接口及实现部分
  • 可以取代多层继承方案,极大地减少子类的个数
  • 提高系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则

缺点

  • 关联关系建立在抽象,会增加系统的理解与设计难度
  • 正确识别两个独立的变化维度有难度

标签:Bridge,name,桥接,self,模式,def,str,class,penType
From: https://www.cnblogs.com/Higgerw/p/17958342

相关文章

  • Python实现软件设计模式7:适配器模式 Adapter Pattern
    动机有两个不存在直接继承或关联关系的类A、B,A希望能利用到B类中某个已存在的、功能完善的方法,而不再去具体实现A的接口源码;适配器模式使接口不兼容的那些类可以一起工作。主要角色目标类Target抽象接口类适配者Adaptee适配器Adapter具体实现接口客户端C......
  • IntelliJ IDEA Debug模式下结束后继续执行代码问题
    1.默认的配置默认的Debug模式下点击Stop后会继续执行代码。2.设置不继续执行后续代码Preferences->Build,Execution,Deployment->Debugger找到Java那一栏下边可以看到Killthedebugprocessimmediately选项,勾选后点击确定就可以了。或是直接在设置搜索框里输入Kil......
  • 掌握Java Future模式及其灵活应用
    第1章:引言大家好,我是小黑,今天咱们来聊聊Future。咱们程序员在日常工作中,肯定都遇到过需要处理耗时任务的情况,特别是在Java领域。比如说,小黑要从网络上下载数据,或者要执行一个计算密集型任务,这些操作都可能需要花费一些时间。在这种场景下,如果小黑还要保持程序的响应性,就得用到异......
  • 【设计模式】模板方法模式——模板方法模式在JDK源码中的应用
    模板方法模式在JDK源码里最典型的实现就是AQSAbstractQueuedSynchronizerAQS(AbstractQueuedSynchronizer)的部分代码如下:publicabstractclassAbstractQueuedSynchronizerextendsAbstractOwnableSynchronizerimplementsjava.io.Serializable{//……代码......
  • C++设计模式05 —— 装饰模式
    装饰模式过度的使用继承使得派生的子类过多,代码重复度很高,复用性变差。实现加密文件流、加密网络流、加密内存流、缓冲文件流、缓冲网络流、缓冲内存流。如果我们创建一个流基类,然后创建文件流继承流基类,最后创建加密文件流继承文件流、创建缓冲文件流继承文件流。如果这......
  • Spark 框架模块和Spark的运行模式 -
    整个Spark框架模块包含:SparkCore、SparkSQL、SparkStreaming、SparkGraphX、SparkMLlib,而后四项的能力都是建立在核心引擎之上SparkCore:Spark的核心,Spark核心功能均由SparkCore模块提供,是Spark运行的基础。SparkCore以RDD为数据抽象,提供Python、Java、Scala、R语......
  • SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662设计模式-单例模式-饿汉式单例模式、懒汉式单例模式、静态内部类在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/......
  • C++设计模式04 —— 观察者模式
    观察者模式一种一对多的依赖关系,当被依赖的对象发生改变时,所有依赖它的对象都能够做出相应的改变。为一个文件分割器加入进度展示。我们需要支持多个类型的进度条,我们可以随意操控进度条的样式细节。首先,我们做一个进度条的抽象基类classIProgress{public:virtu......
  • 【Cpp 基础】分离式编译模式
    模式定义分离编译模式源于C语言,在C++语言中继续沿用。简单地说,分离编译模式是指:一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件连接起来形成单一的可执行文件的过程。 模式由来分离编译模式是C/C++组织源代码和生成可执行文件的方......
  • TCC事务模式使用
    整体机制TCC模式采用的也是两阶段提交的模型,区别于AT和XA模式,TCC模式的两阶段需要自定义实现,不依赖于数据库的事务模型和协议。机制示例图工作机制TCC模式客户端使用时需要分try、commit、cancel三个部分:try:检查预留资源commit:执行真正业务的提交Cancel:预留资源的释放......