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)类就可以,然后经过组合来实际各种各样的玩具。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值