扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Python软件开发中引入设计模式是由生活中的一些实例启发而来的。例如,有2个小朋友Alice和Jack,去麦当劳点餐。Alice不了解麦当劳的套餐模式,于是想了一下,跟服务员说:“我要一个麦辣鸡腿堡、一个薯条和一杯可乐”。而Jack经常吃麦当劳,他也想点和Alice一样的餐品。Jack发现其实Alice点的就是麦当劳的A套餐,于是他直接和服务员说:“给我一个A套餐”。
成都创新互联公司专业为企业提供印江网站建设、印江做网站、印江网站设计、印江网站制作等企业网站建设、网页设计与制作、印江企业网站模板建站服务,十载印江做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
从上面的事例中可以看出,Jack的点餐效率高,因为Jack和服务员都了解麦当劳的套餐模式,沟通起来效率自然就高。那么在这个生活案例中,创建套餐是提高点餐效率的可重用解决方案。它会根据客户的需求和餐品的被点频次制定出符合不同人群的套餐。套餐可以重复被更多的人去点,因此大大提高了顾客与服务员之间的沟通效率。
同理,在软件开发世界里,本来没有设计模式的,用的人多了,也便总结出了设计模式。这就是设计模式的由来。设计模式针对同一情境,众多软件开发人员经过长时间总结,便得到了最佳可重用解决方案。这个可重用解决方案解决了软件开发过程中常见的问题,拥有固定的术语,因此交流起来就方便了很多。
综上,设计模式是软件开发过程中共性问题的可重用解决方案。设计模式的内涵第一是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。第二是用来解决共性问题。设计模式的外延有:单例模式、工厂模式、适配器模式、代理模式等。据悉,现用的设计模式有24种,随着时代的发展,软件编程可能会遇到新的场景,设计模式会越来越丰富。
先看一个设计模式中最基本的单例模式的例子。Windows里面的任务管理器就是个典型的单例模式软件。这是因为Windows任务管理器只能打开一个,就算用户重复打开,也只能获得一个实例,这不同于word等软件可以打开多个实例。其中的原因就是如果有2个窗口同时都能结束某进程,这就会造成在窗口A中某进程结束了,在窗口B中该进程还保留的;同理反过来,某进程在窗口B中结束了,而在窗口A中还保留着。这样就会造成冲突,系统崩溃。Windows里面的任务管理器符合单例模式,保证一个类仅有一个实例的设计模式。
python常用的几种设计模式有:1、单例模式,确保某一个类只有一个实例;2、工厂模式,使用一个公共的接口来创建对象;3、策略模式,随着策略对象改变内容;4、门面模式,对子系统的封装,使得封装接口不会被单独提出来。
什么是设计模式?
设计模式是一套被反复使用,多数人知道,经过分类编目的代码设计经验总结。
使用设计模式是为了提高代码可重用性,可阅读性,和可靠性。
你说理解的设计模式有几种?
设计模式又可分为三种:创建型(单例模式)、(工厂模式),结构型,行为型(策略模式)
单例模式以及应用场景:
(1)确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。Windows的Task Manager(任务管理器)、Recycle Bin(回收站)、网站计数器
(2)单例模式应用的场景一般发现在以下条件下:
资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。控制资源的情况下,方便资源之间的互相通信。如线程池等
要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
工厂模式:
提供一个创建对象的接口,不像客户端暴露创建对象的过程,而是使用一个公共的接口来创建对象。
可以分为三种:简单工厂 工厂方法 抽象工厂
一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
策略模式:
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
要点:把一个个策略,也就是算法封装成一个一个类,任意的替换
解决的问题:避免多个if....else带来的复杂
使用场景:系统中需要动态的在集中算法中动态的选择一种,
门面模式:
门面模式也叫外观模式,定义如下:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。门面模式注重“统一的对象”,也就是提供一个访问子系统的接口。门面模式与之前说过的模板模式有类似的地方,都是对一些需要重复方法的封装。但从本质上来说,是不同的。模板模式是对类本身的方法的封装,其被封装的方法也可以单独使用;而门面模式,是对子系统的封装,其被封装的接口理论上是不会被单独提出来用的。
一个对象有很多行为,如果么有选择合适的设计模式,这些行为就需要用多重的条件判断来实现算法的切换,增加了代码的复杂度。
推荐课程:Python面对对象(Corey Schafer)
"""
观察者模式:又叫发布-订阅模式。
它定义了一种一对多的依赖关系,让多个观察者对象同时鉴定某一个主题对象。这个主题对象在状态发生变化时,
会通知所有的观察者对象,使它们能够自动更新自己。
观察者模式所做的工作实际上就是解耦,根据“依赖倒转原则”,让耦合的双方都依赖于抽象,而不是依赖于具体,
从而使得各自的变化都不会影响另一边的变化。
实际场景中存在的问题:现实中实际观察者不一定有实现观察者的通知回调方法。
解决之道:
1、为其封装一个观察类出来,实现相应的接口。
2、修改通知类,让具体观察者的Notify函数直接去调用相应的接口。
"""
class Subject(object):
def __init__(self):
self._observers = []
def attach(self, observer):
if observer not in self._observers:
self._observers.append(observer)
def detach(self, observer):
try:
self._observers.remove(observer)
except ValueError:
pass
def notify(self, modifier=None):
for observer in self._observers:
if modifier != observer:
observer.update(self)
#用法示例
class Data(Subject):
def __init__(self, name=''):
Subject.__init__(self)
self.name = name
self._data = 0
@property
def data(self):
return self._data
@data.setter
def data(self, value):
self._data = value
self.notify()
class HexViewer:
def update(self, subject):
print('十六进制查看器: 主题 %s 有数据 0x%x' % (subject.name, subject.data))
class DecimalViewer:
def update(self, subject):
print('十进制查看器: 主题 %s 有数据 %d' %
(subject.name, subject.data))
# 用法示例...
def main():
data1 = Data('Data 1')
data2 = Data('Data 2')
view1 = DecimalViewer()
view2 = HexViewer()
data1.attach(view1)
data1.attach(view2)
data2.attach(view2)
data2.attach(view1)
print("设置数据1变量 = 10")
data1.data = 10
print("设置数据2变量 = 15")
data2.data = 15
print("设置数据1变量 = 3")
data1.data = 3
print("设置数据2变量 = 5")
data2.data = 5
print("从data1和data2分离HexViewer。")
data1.detach(view2)
data2.detach(view2)
print("设置数据1变量 = 10")
data1.data = 10
print("设置数据2变量 = 15")
data2.data = 15
if __name__ == '__main__':
main()
Python设计模式主要分为三大类:创建型模式、结构型模式、行为型模式;三 大类中又被细分为23种设计模式,以下这几种是最常见的。
单例模式:是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个是实例时,单例对象就能派上用场。单例对象的要点有三个:一是某个类只能有一个实例;二是它必须自行创建整个实例,三是它必须自行向整个系统提供这个实例。
工厂模式:提供一个创建对象的接口,不像客户端暴露创建对象的过程,使用一个公共的接口来创建对象,可以分为三种:简单工厂、工厂方法、抽象工厂。一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模式。
策略模式:是常见的设计模式之一,它是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。换句话来讲,就是针对一个问题而定义出一个解决的模板,这个模板就是具体的策略,每个策略都是按照这个模板进行的,这种情况下我们有新的策略时就可以直接按照模板来写,而不会影响之前已经定义好的策略。
门面模式:门面模式也被称作外观模式。定义如下:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。门面模式注重统一的对象,也就是提供一个访问子系统的接口。门面模式与模板模式有相似的地方,都是对一些需要重复方法的封装。但本质上是不同的,模板模式是对类本身的方法的封装,其被封装的方法也可以单独使用;门面模式,是对子系统的封装,其被封装的接口理论上是不会被单独提出来使用的。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流