Python与设计模式之桥接模式的那些事儿

内容:将一个事物的两个维度分离,使其都可以独立地变化

应用场景:当事件有两个维度上的表现,两个维度都可能需要扩展时。

话说始皇把打仗的事情交给了皇三,那作为储君的皇大可不能没有什么建树,所于就把国家的经验建设任务交给了皇大,所谓是经济决定上层建筑。皇大想了很久,终于想出来,先从汽车玩具开始建起来,有条不紊开始生产了。汽车玩具TOY就有(汽车,卡车,公交车)类,又有不同颜色类(红色,绿色,蓝色)。 皇大接到了订单,生产汽车,卡车,然后又要求有红色跟绿色那么代码就是

class Toy():
    pass
clsaa Car(Toy):
    pass
class Truck(Toy):
    pass
#生产红色的汽车、卡车
class RedCar(Car):
    pass
class RedTruck(Truck):
    pass

#生产绿色的汽车、卡车
class GreenCar(Car):
    pass
class GreenTruck(Truck):

皇大又接到了蓝色的汽车,卡车,还有人下了黄色的公交车订单,使用这种方法生产后,皇大发现了,工厂里开了一堆的生产线,成本一下子就上升级了,而且每个生产线只能完成一件事情,利用率也不高,然后皇大想着,能不能把所有生产汽车的颜色都在一条线上来实现。想生产红色就上红色的料,想生产绿色就上绿色的料。于是代码就可以把这两个维度来解耦了。

class Toy(metaclass=ABCMeta):#制作玩具
    def __init__(self,color):
        self.color = color #定义一个属性,组合传进来的实例,颜色做为玩具类的一个属性
    @abstractmethod
    def make(self):
        pass

class Corlor(metaclass=ABCMeta):
    @abstractmethod
    def paint(self,Toy):#喷漆,那肯定是要有制造好的东西,这个传入Toy,给玩具喷漆
        pass

#以上两个,一个是玩具实体,一个颜色,我们要把这两个维度关联起来,我们使用组合的方式来组合起来。这里跟适配器有点像
class Car(Toy):#制造汽车类
    #这里实际上已经继承了Toy的__init__方法
    name = "汽车"
    def make(self):#实现抽象方法
        #要通过颜色的喷漆来实现,就是调用自己的color对象
        self.color.paint(self)#(self)这里指的是 paint(self,Toy)里的Toy
         
class Trunck(Toy):#制造卡车类
    name = "卡车"
    def make(self):
        self.color.paint(self)
class Red(Corlor):
    def paint(self,Toy):
        print(f'红色的{Toy.name}')
class Green(Corlor):
    def paint(self,Toy):
        print(f'绿色的{Toy.name}')
#---------------------------------------
#要生产红色的汽车
c=Car(Red())#Car继承了Toy类,继承了__init__方法,所以需要传入指定的颜色实例。通过传入红色实例
c.make()
c1=Trunck(Green())#绿色实际
c1.make()
#--------------------------------------------------------
#红色的汽车
#绿色的卡车

通过上面代码的改造,这样皇大以后接到任何玩具要求都不怕了,比如接到bus,就生产一个Bus(Toy)类,如果求要有紫色,就是生产增加一个Purple(Color)类就可以,然后经过组合来实际各种各样的玩具。

皇始看到了皇大的如此努力,深感欣慰,每天都笑不笼嘴。

相关推荐

  1. Python设计模式模式那些事儿

    2024-04-22 12:42:03       41 阅读
  2. 【前端设计模式模式

    2024-04-22 12:42:03       68 阅读
  3. 设计模式模式

    2024-04-22 12:42:03       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 12:42:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 12:42:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 12:42:03       87 阅读
  4. Python语言-面向对象

    2024-04-22 12:42:03       96 阅读

热门阅读

  1. android gradle引入其他gradle文件

    2024-04-22 12:42:03       37 阅读
  2. SystemC 等待异步事件解决方案

    2024-04-22 12:42:03       44 阅读
  3. 常见DNS故障和问题解决过程

    2024-04-22 12:42:03       33 阅读
  4. Linux命令学习—Apache 服务器(下)

    2024-04-22 12:42:03       38 阅读
  5. 星期一(蓝桥杯)

    2024-04-22 12:42:03       38 阅读
  6. Remove the specified nodes in the linked list with dummy header

    2024-04-22 12:42:03       34 阅读
  7. python开发应该具备哪些能力

    2024-04-22 12:42:03       35 阅读
  8. Linux技术问答系列-NO7

    2024-04-22 12:42:03       36 阅读
  9. 【Qt之·Qt插件开发·导出插件类的步骤】

    2024-04-22 12:42:03       30 阅读
  10. C++20实践入门之类模板学习笔记

    2024-04-22 12:42:03       35 阅读
  11. Linux 远程联机服务(二)- Rsh服务器

    2024-04-22 12:42:03       32 阅读
  12. 数据结构-并查集

    2024-04-22 12:42:03       31 阅读
  13. Mac下 allure的下载与配置

    2024-04-22 12:42:03       35 阅读