内容:将一个事物的两个维度分离,使其都可以独立地变化
应用场景:当事件有两个维度上的表现,两个维度都可能需要扩展时。
话说始皇把打仗的事情交给了皇三,那作为储君的皇大可不能没有什么建树,所于就把国家的经验建设任务交给了皇大,所谓是经济决定上层建筑。皇大想了很久,终于想出来,先从汽车玩具开始建起来,有条不紊开始生产了。汽车玩具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)类就可以,然后经过组合来实际各种各样的玩具。
皇始看到了皇大的如此努力,深感欣慰,每天都笑不笼嘴。