设计模式原则

设计模式概念

设计模式用于解决反复出现的问题,是解决特定问题的指导方针。设计模式不是在应用中引用的类、package 或者库,而是在某些特定场景下解决特定问题的指导方针。

维基百科中这样描述设计模式

在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案。

并非所有的软件模式都是设计模式,设计模式特指软件“设计”层次上的问题。还有其他非设计模式的模式,如架构模式。同时,算法不能算是一种设计模式,因为算法主要是用来解决计算上的问题,而非设计上的问题。

经典的设计模式有 23 种,每种都是对代码复用和设计的总结。

设计模式分类

  • 创建型模式:专注于如何初始化对象。
  • 结构型模式:主要关注对象组合,换句话说,关注实体之间如何互相使用。或者还有另外一个解释,结构型模式有助于回答“如何构建软件组件?”
  • 行为型模式:关心对象之间的责任分配。与结构型模式不同的是,行为型模式不仅仅指定结构,而且还概述了它们之间的消息传递/通信的模式。或者换句话说,行为型模式帮助回答了“软件组件是如何运行的?”

设计模式原则

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

在 《敏捷软件开发》 中,把 职责 定义为 变化的原因,也就是说,就一个类而言,应该只有一个引起它变化的原因。这是一个最简单,最容易理解却最不容易做到的一个设计原则。

单一职责有两个含义:一个是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多职责

设计模式举例:工厂模式、命令模式、代理模式

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

使用多个专门的接口比使用单个接口要好得多。

ISP 强调的是接口对客户端(接口的使用方)的承诺越少越好,并且要做到专一。当某个客户程序的要求发生变化,而迫使接口发生改变时,影响到其他客户程序的可能性小。这实际上就是接口污染的问题。

过于臃肿的接口设计是对接口的污染。所谓接口污染就是为接口添加不必要的职责。为了能够重用被污染的接口,接口的实现类就被迫要实现并维护不必要的功能方法。

3. 开放-封闭原则(Open-Close Principle,OCP)

  • Open(Open for extension) 模块的行为必须是开放的、支持扩展的,而不是僵化的。
  • Closed(Closed for modification) 在对模块的功能进行扩展时,不应该影响或大规模地影响已有的程序模块。

用一句话概括就是:一个模块在扩展性方面应该是开放的而在更改性方面是封闭的

设计模式举例:装饰模式

4. 里氏替换原则(Liskov Substitution Principle,LSP)

LSP 主要是针对继承的设计原则,它指导我们如何正确地进行继承与派生。 子类必须能够替换掉他们的父类、并出现在父类能够出现的任何地方

如何遵守该设计原则呢?

  • 父类的方法都要在子类中实现或者重写,并且派生类只实现其抽象类中声明的方法,而不应当给出多余的方法定义或实现。
  • 在客户端程序中只应该使用父类对象而不应当直接使用子类对象,这样可以实现运行期内绑定(动态多态性)。

5. 依赖倒置原则(Dependence Inversion Principle,DIP)

什么是依赖倒置呢?简单的讲就是将依赖关系倒置为依赖接口。

为什么要依赖接口?因为接口体现对问题的抽象,同时由于抽象一般是相对稳定的或者是相对变化不频繁的,而具体是易变的。因此,依赖抽象是实现代码扩展和运行期内绑定(多态)的基础。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *