首页 > 编程语言 > 详细

Python的设计模式

时间:2019-04-17 10:42:32      阅读:108      评论:0      收藏:0      [点我收藏+]

设计模式的定义:为了解决面向对象系统中重要和重复的设计封装在一起的一种代码实现框架,可以使得代码更加易于扩展和调用

四个基本要素:模式名称,问题,解决方案,效果

六大原则:

  1.开闭原则:一个软件实体,如类,模块和函数应该对扩展开发,对修改关闭.既软件实体应尽量在不修改原有代码的情况下进行扩展.

       2.里氏替换原则:所有引用父类的方法必须能透明的使用其子类的对象

       3.依赖倒置原则:高层模块不应该依赖底层模块,二者都应该依赖其抽象,抽象不应该依赖于细节,细节应该依赖抽象,换而言之,要针对接口编程而不是针对实现编程

       4.接口隔离原则:使用多个专门的接口,而不是使用单一的总接口,即客户端不应该依赖那些并不需要的接口

       5.迪米特法则:一个软件实体应该尽可能的少与其他实体相互作用

       6.单一直责原则:不要存在多个导致类变更的原因.即一个类只负责一项职责

零:接口

  定义:一种特殊的类,声明了若干方法,要求继承该接口的类必须实现这种方法

    作用:限制继承接口的类的方法的名称及调用方式,隐藏了类的内部实现

技术分享图片 View Code

一:单例模式

     定义:保证一个类只有一个实例,并提供一个访问它的全局访问点

     适用场景:当一个类只能有一个实例而客户可以从一个众所周知的访问点访问它时

     优点:对唯一实例的受控访问,相当于全局变量,但是又可以防止此变量被篡改

技术分享图片 View Code

二:简单工厂模式

     定义:不直接向客户暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例

     角色:工厂角色,抽象产品角色,具体产品角色

     优点:隐藏了对象创建代码的细节,客户端不需要修改代码

     缺点:违反了单一职责原则,将创建逻辑集中到一个工厂里面,当要添加新产品时,违背了开闭原则

技术分享图片 View Code

三:工厂方法模式

     定义:定义一个创建对象的接口(工厂接口),让子类决定实例化哪个接口

     角色:抽象工厂角色,具体工厂角色,抽象产品角色,具体产品角色

     适用场景:需要生产多种,大量复杂对象的时候,需要降低代码耦合度的时候,当系统中的产品类经常需要扩展的时候

     优点:每个具体的产品都对应一个具体工厂,不需要修改工厂类的代码,工厂类可以不知道它所创建的具体的类,隐藏了对象创建的实现细节

     缺点:每增加一个具体的产品类,就必须增加一个相应的工厂类

技术分享图片 View Code

四:抽象工厂模式

   定义:定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象

     角色:抽象工厂角色,具体工厂角色,抽象产品角色,具体产品角色,客户端

     适用场景:系统要独立于产品的创建和组合时,强调一系列相关产品的对象设计以便进行联合调试时,提供一个产品类库,想隐藏产品的具体实现时

     优点:将客户端与类的具体实现相分离,每个工厂创建了一个完整的产品系列,易于交换产品.有利于产品的一致性

     缺点:难以支持新种类的产品

技术分享图片 View Code

 五:建造者模式

     定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

     角色:抽象建造者,具体建造者,指挥者,产品

     适用场景:当创建复杂对象的算法应该独立于对象的组成部分以及它的装配方式,当构造过程允许被构造的对象有不同的表示

     优点:隐藏了一个产品的内部结构和装配过程,将构造代码与表示代码分开,可以对构造过程进行更精确的控制

技术分享图片 View Code

 六:适配器模式

     定义:将一个接口转换为客户希望的另一个接口,该模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

     角色:目标接口,待适配的类,适配器

     适用场景:想使一个已经存在的类,但其接口不符合你的要求.想对一些已经存在的子类.不可能每一个都是用子类来进行适配,对象适配器可以适配其父类接口

技术分享图片

技术分享图片 View Code

 七:组合模式

     定义:将对象组合成树形结构以表示‘部分-整体‘的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性

     角色:抽象组件,叶子组件,复合组件,客户端

     适用场景:表示对象的‘部分-整体‘层次结构,希望用户忽略组合对象与单个对象的不同,用户统一使用组合结构中的所有对象

     优点:定义了包含基本对象和组合对象的类层次结构,简化客户端代码,即客户端可以一致的使用组合对象和单个对象,更容易新增新类型的组件

     缺点:很难限制组合中的组件

技术分享图片 View Code

八:代理模式

   定义:为其他对象提供一种代理以控制对特定对象的访问

     角色:抽象实体,实体,代理

     适用场景:远程代理(为远程的对象提供代理),虚代理(根据需要创建很大的对象,即懒加载),保护代理(控制对原始对象的访问,用于具有不同访问权限的对象)

     优点:远程代理(可以隐藏对象位于远程地址空间的事实),虚代理(可对大对象的加载进行优化),保护代理(允许在访问一个对象时有一些附加的处理逻辑,例如权限控制)

技术分享图片 View Code

 九:观察者模式

     定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并被自动更新.观察者模式又称为‘发布订阅‘模式

     角色:抽象主题,具体主题(发布者),抽象观察者,具体观察者(订阅者)

     适用场景:当一个抽象模型有两个方面,其中一个方面依赖于另一个方面.将两者封装在独立的对象中以使它们各自独立的改变和复用

                    当一个对象的改变需要同时改变其他对象,而且不知道具体有多少对象以待改变

                    当一个对象必须通知其他对象,而又不知道其他对象是谁,即这些对象之间是解耦的

     优点:目标和观察者之间的耦合最小,支持广播通信

     缺点:多个观察者之间互不知道对方的存在,因此一个观察者对主题的修改可能造成错误的更新

技术分享图片 View Code

十:策略模式

     定义:定义一系列的算法把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化

     角色:抽象策略,具体策略,上下文

     适用场景:许多相关的类仅仅是行为有异,需使用一个算法的不同变体,算法使用了客户端无需知道的数据,一个类中的多个行为以多个条件语句存在可以将其封装在不同的策略类中

     优点:定义了一系列可重用的算法和行为,消除了一些条件语句,可提供相同行为的不同实现

     缺点:客户必须了解不同的策略,策略与上下文之间的通信开销,增加了对象的数目

技术分享图片 View Code

 十一:责任链模式

     定义:使多个对象有机会处理请求,从而避免请求的发布者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象能处理它为止

     角色:抽象处理者,具体处理者,客户端

     适用场景:有多个对象可以处理一个请求,哪个对象处理由运行时决定

     优点:降低耦合度,一个对象无需知道是其他哪一个对象处理其请求

     缺点:请求不保证被接收,链的末端没有处理或链配置错误

技术分享图片 View Code
技术分享图片 View Code

 十二:迭代器模式

     定义:提供一种方法可顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部指示

     适用场景:实现方法__iter__,__next__

技术分享图片 View Code

十三:模板方法模式

     定义:定义一个操作中算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法某些特定的步骤

     角色:抽象类(定义抽象的原子操作,实现一个模板方法作为算法的骨架),具体类(实现原子操作)

     适用场景:一次性实现一个算法不变的部分,各个子类的公共行为,应该被提取出来集中到公共的父类中以避免代码重复,控制子类扩展

Python的设计模式

原文:https://www.cnblogs.com/zhangyafei/p/10721832.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!