设计模式概论

在这里插入图片描述
设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。

1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。

这 23 种设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分理解。

23种设计模式分类

23种设计模式分为3大类:
创建型5个:对象实例化的模式,用于解耦对象的实例化过程
工厂方法模式、抽象工厂模式、原型模式、建造者模式、单例模式
结构型7个:将类或对象结合在一起形成更大的结构
外观模式、适配器模式、组合模式、代理模式、装饰模式、桥接模式、享元模式
行为型11个:类和对象之间如何交互、划分职责与算法
观察者模式、中介者模式、职责链模式、状态模式、命令模式、模板方法模式、策略模式、迭代器模式、解释器模式、备忘录模式、访问者模式

六大原则

单一职责

单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,由罗伯特·C.马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)。

优点
  1. 降低类的复杂度。
  2. 提高类的可读性
  3. 提高系统的可维护性。
  4. 变更引起的风险降低。

开闭原则

开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出:软件实体(模块、类与接口、方法)应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。

作用

开闭原则是面向对象程序设计的终极目标,它使软件具有一定的灵活性和适应性的同时还具备稳定性和延续性。

  1. 测试:软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试即可,原有的代码还可以继续运行。
  2. 复用性:粒度越小,被复用的可能性越大。
  3. 可维护性:遵守开闭原则的软件,其稳定性和延续性强,从而易于扩展和维护。

里式替换原则

里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。

作用
  1. 里式替换原则是实现开闭原则的重要方式之一。
  2. 他克服了继承中重写父类造成的可复用性变差的缺点。
  3. 它是动作正确性的保证,即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。

依赖倒置

依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。其核心思想是:要面向接口编程,不要面向实现编程。

作用
  1. 降低类之间的耦合性。
  2. 提高系统的稳定性
  3. 减少并发开发引起的风险。
  4. 提高代码的可读性和可维护性。

接口隔离

2002 年罗伯特·C.马丁给“接口隔离原则”的定义是:客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。该原则还有另外一个定义:一个类对另一个类的依赖应该建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)。

优点
  1. 将大接口分解为多个粒度小的接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
  2. 接口隔离提高了系统的内聚行,减少了对外交互,和降低了系统的耦合性。
  3. 保证系统的稳定性
  4. 使用多个专门的接口能够体现对象的层次。
  5. 减少项目中代码的冗余。

迪米特

迪米特法则(Law of Demeter,LoD)又叫作最少知识原则(Least Knowledge Principle,LKP),产生于 1987 年美国东北大学(Northeastern University)的一个名为迪米特(Demeter)的研究项目,由伊恩·荷兰(Ian Holland)提出,被 UML 创始者之一的布奇(Booch)普及,后来又因为在经典著作《程序员修炼之道》(The Pragmatic Programmer)提及而广为人知。

迪米特法则的定义是:只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。

优点
  1. 降低了类之间的耦合性,提高了模块的独立性
  2. 提高了类的可复用性和系统的扩展性。

感谢大神们的指导:
http://c.biancheng.net/design_pattern/
https://juejin.im/post/5a52144d6fb9a01c9b65c651#heading-4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值