博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python设计模式——装饰模式(Decorator)
阅读量:5816 次
发布时间:2019-06-18

本文共 2713 字,大约阅读时间需要 9 分钟。

假如我们需要开发一个程序来展示一个人穿衣服的过程。

#encoding=utf-8__author__ = 'kevinlu1010@qq.com'class Person():    def __init__(self,name):        print '%s开始穿衣'%name    def wear_tshirt(self):        print '穿TShirst'    def wear_trouser(self):        print '穿裤子'    def wear_shoe(self):        print '穿T鞋子'    def wear_tie(self):        print '穿领带'if __name__=='__main__':    person=Person('kevin')    person.wear_shoe()    person.wear_tie()    person.wear_trouser()

这样写无疑是最快的,代码最简洁的,但是扩展性比较差,例如客户要求我们增加一个穿袜子的动作,我们就需要修改Person类,但是根据封闭-开发原则中的封闭原则,一个类写完之后是尽量不要修改它的,所以我们就需要另外一种实现方式

#encoding=utf-8__author__ = 'kevinlu1010@qq.com'from abc import ABCMeta, abstractmethodclass Person():    def __init__(self, name):        print '%s开始穿衣' % nameclass Finery():    __metaclass__ = ABCMeta    @abstractmethod    def show(self):        passclass TShirt(Finery):    def show(self):        print '穿TShirst'class Trouser(Finery):    def show(self):        print '穿裤子'class Shoe(Finery):    def show(self):        print '穿鞋子'class Tie(Finery):    def show(self):        print '穿领带'if __name__ == '__main__':    person = Person('kevin')    finerys=[]    finerys.append(TShirt())    finerys.append(Trouser())    finerys.append(Shoe())    finerys.append(Tie())    map(lambda x:x.show(),finerys)

首先定义一个积累Finery,定义一个抽象方法show,然后每一个穿衣动作都写一个类,重写show方法。

如果客户修改需求,我们就新增加一个类就可以了。

 装饰模式的做法:

#encoding=utf-8__author__ = 'kevinlu1010@qq.com'from abc import ABCMeta, abstractmethodclass Person():    def __init__(self, name):        self.name = name    def decorator(self, component):        self.component = component    def show(self):        print '%s开始穿衣' % self.name        self.component.show()class Finery():    def __init__(self):        self.component = None    def decorator(self, component):        self.component = component    __metaclass__ = ABCMeta    @abstractmethod    def show(self):        if self.component:            self.component.show()class TShirt(Finery):    def show(self):        Finery.show(self)        print '穿TShirst'class Trouser(Finery):    def show(self):        Finery.show(self)        print '穿裤子'class Shoe(Finery):    def show(self):        Finery.show(self)        print '穿鞋子'class Tie(Finery):    def show(self):        Finery.show(self)        print '穿领带'if __name__ == '__main__':    person = Person('kevin')    tshirt = TShirt()    trouser = Trouser()    shoe = Shoe()    tie = Tie()    trouser.decorator(tshirt)    shoe.decorator(trouser)    tie.decorator(shoe)    person.decorator(tie)    person.show()

每个类都有show方法,衣服类都有decorator方法,利用这个方法,动态地把不同衣服的show方法装饰到person这个类上,这样做一方面可以令person类更为精简,因为在实际应用中Person类可能会有很多方法,而穿衣服这个需求只是其中一个,另一方面是,增加Person类的可扩展性,例如如果Person类已经写好了,现在新的需求需要在某一次调用Person类的show方法的时候增加穿衣服的功能,这种模式就能很好地实现了。

 

转载地址:http://lymbx.baihongyu.com/

你可能感兴趣的文章
数据结构——串的朴素模式和KMP匹配算法
查看>>
FreeMarker-Built-ins for strings
查看>>
验证DataGridView控件的数据输入
查看>>
POJ1033
查看>>
argparse - 命令行选项与参数解析(转)
查看>>
一维数组
查看>>
Linux学习笔记之三
查看>>
CentOS 6.6 FTP install
查看>>
图解Ajax工作原理
查看>>
oracle导入导出小记
查看>>
聊一聊log4j2配置文件log4j2.xml
查看>>
NeHe OpenGL教程 第七课:光照和键盘
查看>>
修改上一篇文章的node.js代码,支持默认页及支持中文
查看>>
Php实现版本比较接口
查看>>
删除设备和驱动器中软件图标
查看>>
第四章 TCP粘包/拆包问题的解决之道---4.1---
查看>>
html语言
查看>>
从源码看集合ArrayList
查看>>
spring-boot支持websocket
查看>>
菜鸟笔记(一) - Java常见的乱码问题
查看>>