python面向对象设计模式_python面向对象之设计模式
单例模式
意图
单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用性
当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
#coding=utf-8
class Singleton(object):
def __new__(cls, *args, **kw):#new的cls放前面
if not hasattr(cls, '_instance'):#如果不存在实例的属性,则新建一个实例,否则返回已有实例
#每个类只要被实例化,私有属性_instance就会被赋值
#下面两句,表示使用object.__new__方法生成了Singleton的一个实例
orig = super(Singleton, cls)#继承父类,super的cls放后面
cls._instance = orig.__new__(cls, *args, **kw)
#cls._instance = object.__new__(cls, *args, **kw) #等价上一句
#否则返回已有实例
return cls._instance
#适用范围:配置信息只需要一份时,可以单例,或者大boss只有一个,可用单例
#资源管理器,回收站,日志
装饰模式:
意图
装饰模式
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
适用性
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
处理那些可以撤消的职责。
当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类
#encoding=utf-8
#代码没有缩进
import time
def deco(func):
def __deco():
list=[]
func(list)
print list
return __deco
@deco
def myfunc(list):
list.append(1)
print " myfunc() called."
@deco
def yourfunc(list):
list.append(2)
print " yourfunc() called."
myfunc()
print "*"*50
yourfunc()
观察者模式
意图
观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
适用性
当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。
抽象工厂模式
抽象工厂模式(Abstract Factory)
意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
工厂模式(单独一个类接收参数,根据参数生成具体的实例)
实例:
#coding=utf-8
class Person:
def __init__(self,gender,name):
self.gender=gender
self.name=name
def getName(self):
return self.name
def getGender(self):
return self.gender
class Male(Person):
def __init__(self,name):
print "hello Mr."+name
class Female(Person):
def __init__(self,name):
print "Hello Miss."+name
class Factory:
def getPerson(self,name,gender):
if gender=="M":
return Male(name)
if gender=="F":
return Female(name)
if __name__=="__main__":
factory=Factory()
person=factory.getPerson("chentao","M")
person=factory.getPerson("lihong","F")
代理模式
意图
代理模式
为其他对象提供一种代理以控制对这个对象的访问。
适用性
在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用Proxy模式。下面是一 些可以使用Proxy模式常见情况:
远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表。
虚代理(Virtual Proxy)根据需要创建开销很大的对象。
保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同 的访问权限的时候。
智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。 它的典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为SmartPointers)。
当第一次引用一个持久对象时,将它装入内存。
在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
命令模式
意图
命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作
适用性
像上面讨论的MenuItem对象那样,抽象出待执行的动作以参数化某对象。你可用过程语言中的回调(callback)函数表达这种参数化机制。所谓回调函数是指函数先在某处注册,而它将在稍后某个需要的时候被调用。Command模式是回调机制的一个面向对象的替代品。
在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可将负责该请求的命令对象传送给另一个不同的进程并在那儿实现该请求。
支持取消操作。Command的Execute操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。Command接口必须添加一个Execute操作,该操作取消上一次Execute调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute和Execute来实现重数不限的“取消”和“重做”。
支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。在Command接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用Execute操作重新执行它们。
用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务(Transaction)的信息系统中很常见。一个事务封装了对数据的一组变动。Command模式提供了对事务进行建模的方法。Command有一个公共的接口,使得你可以用同一种方式调用所有的事务。同时使用该模式也易于添加新事务以扩展系统。
python面向对象设计模式_python面向对象之设计模式相关推荐
- python完全支持面向对象编程_Python 面向对象编程概要
面向对象三大特性 面向对象的三大特性是指:封装.继承和多态. 封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容. 所以,在使用面向对象的封装特性时,需要: 将内容封装到某处 ...
- python面向对象思路_Python面向对象三要素-继承(Inheritance)
Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...
- python面向对象图片_Python面向对象-概念、类、实例
OOP--Object Oriented Programming,面向对象编程,是一种程序设计思想.该思想将对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 区别于面向过程的程序设计即把计 ...
- python封装举例_Python面向对象封装操作案例详解
本文实例讲述了Python面向对象封装操作.分享给大家供大家参考,具体如下: 目标 封装 小明爱跑步 存放家具 01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 -- 将 属性 和 ...
- python面向对象继承_Python 面向对象 --- 继承
目标 单继承 多继承 面向对象三大特性 1,封装 根据 职责 将 属性 和 方法 封装 到以抽象的 类 中 2,继承 实现代码的重用,相同的代码不需要重复的缩写 3,多态 不同的对象调用相同的方法,产 ...
- python完全支持面向对象编程_Python面向对象编程
对象魔法 1.多态 多态指的是能够同样地对待不同类型和类的对象,既无需知道对象属于哪个类就可调用其方法. 2.封装 对象可能隐藏(封装)其内部状态.在有些语言中,这意味着对象的状态(属性)只能通过其方 ...
- python完全支持面向对象编程_python面向对象编程----009
本篇内容: 1.反射 2.面向对象编程 3.面向对象三大特性 4.类成员 5.类成员修饰符 6.类的特殊成员 7.单例模式 反射 python中的反射功能是由以下四个内置函数提供:hasattr.ge ...
- python self理解_Python面向对象总结,让你快速掌握面向对象常用的用法
python等面向对象的提出是为了更好的处理和管理同属一个类别的事情,这样就可以省去多余重复的基础代码,让程序变得更加简洁和强大.对于学习编程的朋友来说,熟悉掌握面向对象是非常重要的. 下面开始讲讲关 ...
- python不完全支持面向对象程序设计_Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】...
本文实例讲述了Python面向对象程序设计OOP.分享给大家供大家参考,具体如下: 类是Python所提供的最有用的的工具之一.合理使用时,类可以大量减少开发的时间.类也在流行的Python工具中使用 ...
最新文章
- 查看mysql本地路径
- CodeForces - 888G Xor-MST(贪心+字典树+最小生成树)
- Oracle EM 12c
- Equipment delta download debug from ERP side
- nginx的脚本引擎(一)
- linux中退格出现乱码,SSH中的SQL命令按退格键出现乱码的问题解决
- fiddler发送post请求
- 股票历史数据下载接口踩坑记录
- WebClient.Credentials 属性 (System.Net)
- VSCode中使用Git忽略提交代码设置
- vue上传、修改头像
- 毕业论文查重不合格会怎么样?
- python定义整型数组_Python数组定义方法
- 计算机win7启动不起来,详解电脑启动不了怎么办
- 超级便携 西数My Passport Ultra试用
- 笔记本电脑无线被禁用 是哪个服务器,笔记本无线网络被禁用怎么打开?|无线网络被禁用打开方法...
- 人工智能——产生式规则
- 开源库UniTask笔记
- vivo X Fold和OPPO Find N
- CSS 中哪些属性可以继承?