Python/PHP/JavaScript/JAVA软件编程设计模式教程

原创 tiangr  2016-12-03 18:13  阅读 163 次

刚开始接触编程时,不明白设计模式到底有什么用途,直到工作这么多年,写的代码越来越多,才开始明白,设计模式将我们日常解决问题的方式抽象出来归类,让我们的代码变得更加简洁健壮,也变得更加灵活,是非常有意义的一件事情。

本站将不同语言版本的设计模式做了一个总结,方便大家在开发工作过程中查阅。

PS: 内容部分来自本人所购书籍和网络,侵权请联系删除。

编程语言 设计模式 使用场景 备注
Python 单例模式 使用单例模式来保证连接数据库只会发生一次 创建型模式
工厂模式 降低代码的耦合性,同时也便于维护。例如:一般的MVC框架中,都有一个基本的DB数据库基本操作类我叫它DB class,有一个baseModel class 去继承 db classbaseModel 是所有框架model的基类,需要继承baseModel,baseModel已经有db类的 增删查改的方法了,baseModel其实就是数据库工厂,不同的模型继承baseModel,就有操作不同数据表的对象实例了,这样就用一个基础的class 完成了实例化各个不同数据表的对象,就好像是工厂一样,传不同的表名字就返回给你不同的对象。
策略模式 可用于权限管理 行为型模式
观察者模式 下达通知消息到不同类型用户
命令模式 封装一些常用指令
模板方法模式
适配器模式 把一个类的接口变换成客户端所期待的另一种接口,使原本因接口不兼容而无法在一起工作的两个类能够在一起工作。 结构型模式
装饰者模式
代理模式 使我们可以在不改变原接口情况下,使用真实对象的地方都可以使用代理对象。其次,代理对象在客户端和真实对象之间直接起到了中介作用,同时通过代理对象,我们可以在将客户请求传递给真实对象之前做一些必要的预处理。
组合模式 Linux 系统内的树形菜单和文件系统。在树形菜单中,每一项菜单可能是一个组合对象,其包含了菜单项和子菜单,这样就形成了一棵对象树。
外观模式 将各种子系统的复杂操作通过外观模式简化,让客户端使用起来更方便简洁。
js 构造器模式 创建型模式
模块模式 模块模式能够使一个单独的对象拥有公有/私有方法变量,从而屏蔽来自全局作用域的特殊部分。
揭示模块模式
单例模式
工厂模式
Mixin模式
观察者模式 行为型模式
中介者模式
原型模式
命令模式
外观模式 结构型模式
装饰者模式
享元模式
php 工厂模式 创建型模式
建造者模式(生成器模式)
单例模式
适配器模式 结构性模式
桥接模式
装饰者模式
外观模式
享元模式
代理模式
命令模式 行为型模式
中介者模式
观察者模式
状态模式
策略模式

设计模式背景

关于设计模式的六大设计原则

单一职责原则 (Single Responsibility Principle)

顾名思义,单一职责的原则是说一个类直负责一项职责(操作)。如果一个类负责多个职责,其中一项职责发生变化就需要修改整个类,这可能会导致其他的职责运行错误。一个类,只应该有一个引起它变化的原因。

其优点有:

  • 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
  • 提高类的可读性,提高系统的可维护性;
  • 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。

里氏替换原则 (Liskov Substitution Principle)

里氏替换的意思是说所有引用基类的地方必须能透明地使用其子类的对象。这种情况在代码中随处可以,我们在类中使用基类进行定义,而在运行时使用子类对象,为了确保代码运行正常,在实现子类时要注意以下一些地方:

  • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法;
  • 子类中可以增加自己特有的方法;
  • 当子类的方法重载父类的方法时,子类方法的输入参数要比父类方法的输入参数更宽松;

依赖倒置原则 (Dependence Inversion Principle)

定义:抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。依赖倒置原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。在编写代码中落到实处,需要注意以下一些地方:

  • 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备;
  • 变量的表名类型尽量是接口或者抽象类;
  • 尽量不要覆写基类的方法;
  • 结合里氏替换原则使用。

由于 Python 是一门动态语言,在传递参数时不需要定义具体类型,所以依赖倒置原则其实一定程度上已经内嵌在了 Python 语言中。

接口隔离原则 (Interface Segregation Principle)

接口隔离原则提示我们客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。

看到这里你们或许认为接口隔离原则与单一职责原则是相同的。其实接口隔离原则与单一职责原则的审视角度是不相同的,单一职责原则要求的是类和接口职责单一,注重的是职责,这是业务逻辑上的划分,而接口隔离原则要求接口的方法尽量少。在使用接口隔离原则时,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。一般而言,接口中仅包含为某一类用户定制的方法即可,不应该强迫客户依赖于那些它们不用的方法。

迪米特原则 (Law of Demeter)

定义:一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的公开方法,我就调用这么多,其他的我一概不关心。迪米特法则指导我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。可以看到迪米特原则在代理模式和外观模式中都有被使用。

开闭原则 (Open Closed Principle)

软件实体应该对扩展开放,对修改关闭,其含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。根据开闭原则,在设计一个软件系统模块(类,方法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放)。遵循开闭原则的系统设计,可以让软件系统可复用,并且易于维护。这也是系统设计需要遵循开闭原则的原因:

  • 稳定性:开闭原则要求扩展功能不修改原来的代码,这可以让软件系统在变化中保持稳定。
  • 扩展性:开闭原则要求对扩展开放,通过扩展提供新的或改变原有的功能,让软件系统具有灵活的可扩展性。

设计模式分类

  • 创建型模式
模式名 描述
抽象工厂模式 为一个产品族提供了统一的创建接口。当需要这个产品族的某一系列的时候,可以从抽象工厂中选出相应的系列创建一个具体的工厂类。
工厂方法模式 定义一个接口用于创建对象,但是让子类决定初始化哪个类。工厂方法把一个类的初始化下放到子类。
生成器模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
惰性初始模式 推迟对象的创建、数据的计算等需要耗费较多资源的操作,只有在第一次访问的时候才执行。
对象池模式 通过回收利用对象避免获取和释放资源所需的昂贵成本。
原型模式 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
单例模式 确保一个类只有一个实例,并提供对该实例的全局访问。
  • 结构性模式
模式名 描述
适配器模式 将某个类的接口转换成客户端期望的另一个接口表示。适配器模式可以消除由于接口不匹配所造成的类兼容性问题。
桥接模式 将一个抽象与实现解耦,以便两者可以独立的变化。
组合模式 把多个对象组成树状结构来表示局部与整体,这样用户可以一样的对待单个对象和对象的组合。
修饰模式 向某个对象动态地添加更多的功能。修饰模式是除类继承外另一种扩展功能的方法。
外观模式 为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
享元 通过共享以便有效的支持大量小颗粒对象。
代理 为其他对象提供一个代理以控制对这个对象的访问。
  • 行为型模式
模式名 描述
黑板 广义的观察者在系统范围内交流信息,允许多位读者和写者。
责任链 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
命令 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
解释器 给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
迭代器 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
中介者 包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可以彼此独立的变化。
备忘录 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
空对象 通过提供默认对象来避免空引用。
观察者模式 在对象间定义一个一对多的联系性,由此当一个对象改变了状态,所有其他相关的对象会被通知并且自动刷新。
规格 以布尔形式表示的可重绑定的商业逻辑。
状态 让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能获取的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。
策略 定义一个算法的系列,将其各个分装,并且使他们有交互性。策略模式使得算法在用户使用的时候能独立的改变。
模板方法 模板方法模式准备一个抽象类,将部分逻辑以具体方法及具体构造子类的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先构建一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。
访问者 封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。
特别提示:本站资源全部免费下载,因服务器需经费维护,文中部分外链点击后会进入广告,请耐心等待5秒即可跳过广告进入目标页面。如遇页面外链打不开或下载地址失效,您可以在评论中指出错误,或扫描页面底部二维码。
本文地址:http://www.tiangr.com/zui-quan-bian-cheng-yu-yan-de-ruan-jian-she-ji-mo-shi-jiao-cheng-python-php-javascript-java.html
版权声明:本文为原创文章,版权归 tiangr 所有,欢迎分享本文,转载请保留出处!

发表评论


表情