Python 设计模式,单例模式,工厂模式,策略模式,观察者模式
目录
一、引入
程序中设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。
这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
二、单例模式
保证只有一个对象
练习1
创建Sun类
练习2
优化练习1写法
练习3
使用导入模块的方式创建单例对象。
注意:在python中导入模块就是一种单例模式。
三、工厂模式
概念
工厂模式是一个在软件开发中用来创建对象的设计模式
当程序运行输入一个“类型”的时候,需要创建于此相应的对象。这就用到了工厂模式。
在如此情形中,实现代码基于工厂模式,可以达到可扩展,可维护的代码。
当增加一个新的类型,不再需要修改已存在的类,只增加能够产生新类型的子类。
使用工厂模式应用场景:不知道用户想要创建什么样的对象
练习
创建Factory工厂类。
四、策略模式
概念
策略指的就是为了达到某一目的而采取的多种手段或者方法。
为了实现软件设计,对象可能会用到多种多样的算法(逻辑)。这些算法甚至会经常改变。如果将这些算法都硬编码到对象中,将会使得对象本身变得臃肿不堪,策略模式很好的实现了将算法与本身对象解耦,从而避免出现上述的问题。
因此策略模式可以定义为:
定义一系列算法(逻辑),将每一个算法封装起来(一个算法创建一个类),并让它们可以相互替换。
此模式让算法的变化,不会影响到使用算法的客户.
策略模式的结构
策略模式包含以下3个角色:
Context(环境类)
Strategy(抽象策略类)
ConcreteStrategy(具体策略类)
练习
假设某司维护着一些客户资料,需要在该司有新产品上市或者举行新活动时通知客户。现通知客户的方式有两种:短信通知、邮件通知。应如何设计该系统的客户通知部分?
为解决该问题,我们先构造客户类,包括客户常用的联系方式和基本信息,同时也包括要发送的内容。
class Client(object):
name=''
phone=''
email=''
send_way=None
def set_send_way(self,send_way):
self.send_way=send_way
def send_msg(self):
self.send_way.send()
再构造策略父类
#发送方式,父类
class MsgSender(object):
des_code=''
info=''
def send(self):
pass
#具体发送方式,子类
class PhoneSend(MsgSender):
def send(self):
print('给{}打电话说{}'.format(self.des_code,self.info))
class EmailSend(MsgSender):
def send(self):
print('给{}发邮件说{}'.format(self.des_code,self.info))
调用部分
class PhoneSend(MsgSender):
def send(self):
print('给{}打电话说{}'.format(self.des_code,self.info))
class EmailSend(MsgSender):
def send(self):
print('给{}发邮件说{}'.format(self.des_code,self.info))
emailsend=EmailSend()
emailsend.des_code=client.email
emailsend.info='新产品上市了,确定不要来看一下吗?'
client.set_send_way(emailsend)
client.send_msg()
结果:
五、观察者模式
class Monitor(object):
def __init__(self):
self.observers=[]
self.status=''
def attach(self,observer):
self.observers.append(observer)
def notify(self):
'''通知每一个观察者'''
for observer in self.observers:
observer.update()
class SleepStudentObserver(object):
def __init__(self,name,monitoor):
self.name=name
self.monitor=monitoor
def update(self):
print('{},{}赶快起来学习吧'.format(self.monitor.status,self.name))
if __name__ == '__main__':
monitor=Monitor()
observerl=SleepStudentObserver('ZS',monitor)
observer2=SleepStudentObserver('lyc',monitor)
monitor.attach(observerl)
monitor.attach(observer2)
monitor.status='老师来了'
monitor.notify()
结果: