定义:前篇初期中,我们讲过结构型模式主要解决的问题是:
它具有的特性:
当不能采用生成子类的方法进行扩充时。
1:一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。
2:另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
扩展功能的方法:
class NiuRou():
def getname(self):
return '牛肉'
class MakeHongshaoniurou():
def __init__(self,rou):
self.rou = rou
def getname(self):
return "红烧加工一下(附加额外的功能):" + self.rou.getname()
print(NiuRou().getname())
print(MakeHongshaoniurou(NiuRou()).getname())
class NiuRou():
def getname(self):
return '牛肉'
class MakeHongshaoniurou(NiuRou):
def getname(self):
return "红烧加工一下(附加额外的功能):" + super(MakeHongshaoniurou,self).getname()
print(NiuRou().getname())
print(MakeHongshaoniurou().getname())
上述的方式需要额外新增相关的类来实现:
同步组合装饰器模式来附加更多额外的:
对牛肉的各自蹂躏!
class NiuRou():
def getname(self):
return '牛肉'
from abc import ABCMeta, abstractmethod
class MakeType(metaclass=ABCMeta):
def __init__(self, niurong):
self.niurong = niurong
@abstractmethod
def getname(self): pass
class Hongshao(MakeType):
def typeaction(self):
return "红烧加工:"
def getname(self):
return self.typeaction() + self.niurong.getname()
class Shuizhu(MakeType):
def typeaction(self):
return "水煮加工:"
def getname(self):
return self.typeaction() + self.niurong.getname()
class Ganguo(MakeType):
def typeaction(self):
return "干锅加工:"
def getname(self):
return self.typeaction() + self.niurong.getname()
# 第一种--只是红烧一下我们的牛肉
a = Hongshao(NiuRou())
print(a.getname())
# 第2种-干锅之后,再红烧一下
b = Hongshao(Ganguo(NiuRou()))
print(b.getname())
# 第3种-干锅之后,再红烧一下-再水煮
c = Shuizhu(Hongshao(Ganguo(NiuRou())))
print(c.getname())
# 第4种-干锅之后,再红烧一下-再水煮========估计不能吃了!
c = Hongshao(Ganguo(Hongshao(Shuizhu(Hongshao(Ganguo(NiuRou()))))))
print(c.getname())
输出的结果为:
红烧加工:牛肉
红烧加工:干锅加工:牛肉
水煮加工:红烧加工:干锅加工:牛肉
红烧加工:干锅加工:红烧加工:水煮加工:红烧加工:干锅加工:牛肉
从上面看得出,我们保持我们的NiuRou不变的情况,新增了各自独立的烹饪手法后,还可以对各种的手法进行叠加使用!:
class NiuRou():
def getname(self):
return '牛肉'
以至于到最后:估计牛肉不再是牛肉了!!!!!
简书:https://www.jianshu.com/u/d6960089b087
掘金:https://juejin.cn/user/2963939079225608
小钟同学 | 文 【原创】| QQ:308711822
1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。