今天Leo来到了图书馆写博客啦~说道省图,真是慢慢的都是回忆呀。中学时代好多的作业都是省图抄别人的TAT。
趁热打铁,我记得课堂上老师说提到过的设计模式貌似就这么多了。所以设计模式Leo这是梳理的最后一个。其实所谓的模式有很多,细分下来至少也有个20-30种。所以以后的路还要靠大家指引提携~所以话不多说,赶紧写出最后的一个模式吧~
今天梳理的是装饰者模式。一如既往,度娘定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象 。
这个又是如何理解呢?别着急,让我再给大家YY一个例子。作为吃货还是从吃说起吧。
话说一天我去大学旁边的奶茶店买奶茶,在窗口映入眼帘的是原味奶茶,香草奶茶,巧克力奶茶等等。当点完奶茶的时候,我看到奶茶店允许顾客从奶茶中添加珍珠,果冻,或者是各式各样的糖什么的,当然价钱的话需要额外的计算。
这样问题来了,每一个顾客的口味不一样呀~萝卜白菜各有所爱对不对?有人喜欢这个,有人喜欢那一个。所以如果要设计这么一套程序的话,我们不能一概而论的将每一杯奶茶都加上香草,布丁,珍珠.....所以呢我们需要动态地给他呈上。这就是装饰者模式的初衷,我不需要改变原来的奶茶的特点或者制作流程,而是在特定的场景下给他包装一下,达到定制以至于满足广大顾客的需求。
那么具体来讲怎么做呢?这个也不难,我们在原来的需要装饰的类(奶茶)中设置一个方法,这个方法可以将装饰的东西装载到类中。然后在此类中设置这个方法让他show出来就好啦~是不是很简单呢!
既然如此,我以奶茶的例子就把这个套路的类图和python实现po出来啦:
class milky_tea:
def __init__(self):
self.name='milky_tea'
def show(self):
print 'original milky tea'
class milky_tea_decorate(milky_tea):
def decorate(self):
pass
class milky_tea_pearl(milky_tea_decorate):
def __init__(self):
self.name='pearl_milky_tea'
def decorate(self):
print'with pearl'
class milky_tea_pudding(milky_tea_decorate):
def __init__(self):
self.name='pudding_milky_tea'
def decorate(self):
print'with pudding'
if __name__=='__main__':
my_milkytea=milky_tea()
my_pearl_milkytea=milky_tea_pearl()
my_pudding_milkytea=milky_tea_pudding()
my_milkytea.show()
my_pearl_milkytea.show()
my_pearl_milkytea.decorate()
my_pudding_milkytea.show()
my_pudding_milkytea.decorate()