设计模式几大原则

来源:互联网 发布:企业大数据平台 阿里 编辑:程序博客网 时间:2024/06/09 02:42

设计模式(面向对象)有几大原则:
- 单一职责原则(Single Responsibility Principle, SRP)
- 开闭原则(Open Closed Principle,OCP)
- 里氏代换原则(Liskov Substitution Principle,LSP)
- 依赖倒置原则(Dependency Inversion Principle,DIP)
- 接口隔离原则(Interface Segregation Principle,ISP)
- 迪米特法则(Law of Demeter, LoD)
- 合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)

单一职责原则(Single Responsibility Principle, SRP)

定义
一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。

单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。

单一职责的优点主要是:降低类的复杂度,提高类的可读性和可维护性。

开闭原则(Open-Closed Principle, OCP)

定义
一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。

抽象化设计是开闭原则的关键:用抽象类构架框架,用实现扩展细节。

里氏代换原则(Liskov Substitution Principle, LSP)

定义
所有引用基类(父类)的地方必须能透明地使用其子类的对象。

里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。

里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

依赖倒置原则(Dependency Inversion Principle, DIP)

定义
抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。

依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。为了确保该原则的应用,一个具体类应当只实现接口或抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用到在子类中增加的新方法。

在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入(DependencyInjection, DI)的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。

常用的注入方式有三种,分别是:构造注入,设值注入(Setter注入)和接口注入。

构造注入是指通过构造函数来传入具体类的对象,设值注入是指通过Setter方法来传入具体类的对象,而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。

开闭是原则,里氏是基础,依赖倒置是手段。

接口隔离原则(Interface Segregation Principle, ISP)

定义
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。一般而言,接口中仅包含为某一类用户定制的方法即可,不应该强迫客户依赖于那些它们不用的方法。

迪米特法则(Law of Demeter, LoD)

定义
又叫 最少知道原则(LeastKnowledge Principle, LKP)
一个软件实体应当尽可能少地与其他实体发生相互作用。

如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。

合成复用原则(Composite Reuse Principle)

定义
又称为组合/聚合复用原则(Composition/Aggregate Reuse Pinciple,CARP),尽量使用对象组合,而不是继承来达到复用的目的。

  • 组合/聚合可以降低类之间的耦合度,并且不会暴漏类的具体实现细节,称为“黑箱复用”;
  • 如果是使用继承机型复用,则会将实现细节暴漏给子类,破会系统的封闭性,如果基类变化,子类也随之变化,不具有灵活性,称为“白箱复用”。

  • 一般来说,如果两个类之间是”Has-A”关系,则使用组合/聚合;如果是”Is-A”关系,则使用继承。

Reference

  • http://www.cnblogs.com/zhangfei614/p/5983773.html
  • http://www.cnblogs.com/dolphin0520/p/3919839.html
原创粉丝点击