python设计模式(八):装饰模式
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
在Python种实现动态扩展对象功能的方法,最简单的是通过复写__getattr__函数,在getattr种写入我们需要扩展的功能,实例代码如下:
特点
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的引用(reference)
(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
设计原则
1. 多组合,少继承。
利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。
2. 类应设计的对扩展开放,对修改关闭。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python设计模式(七):组合模式
组合,将对象组合成树状结构,来表示业务逻辑上的[部分-整体]层次,这种组合使单个对象和组合对象的使用方法一样。 如描述一家公司的层次结构,那么我们用办公室来表示节点,则总经理办公司是根节点,下面分别由人事办公室、业务办公室、生产办公室、财务办公室,每个办公室下面可以还有跟小的办公室,每个办公室都有职责、人员数、人员薪资等属性; 上面描述是逻辑上的描述,用程序如何来实现?看下面代码: classComponentBases: """部门抽象出来的基类""" def__init__(self,name): slef.name=name defadd(self,obj): pass defremove(self,obj): pass defdisplay(self,number): passclassNode(ComponentBases): def__init__(self,name,duty): self.name=name self.duty=duty self.children=[] defadd(self,obj): self.children.append(obj) defrem...
- 下一篇
python设计模式(九):外观模式
#-*-coding:utf-8-*-classAPI1: defSave(self): print('保存数据A') defDel(self): print('删除数据A')classAPI2: defSave(self): print('保存数据B') defDel(self): print('删除数据B')classFacade: def__init__(self): self._api1=API1() self._api2=API2() defSaveAll(self): [obj.Save()forobjin[self._api1,self._api2]] defDelAll(self): [obj.Save()forobjin[self._api1,self._api2]]if__name__=='__main__': test=Facade() test.SaveAll() test.DelAll() ---------------- 保存数据A 保存数据B 删除数据A 删除数据B 外观模式(Facade),亦称“过程模式”,为子系统中的一组接口提供一个一致的界面,Fac...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题