设计模式-01-概述

概述

设计模式是前人对代码开发经验的总结,是解决一系列问题的套路。 是一套解决代码可复用性、可维护性、可读性、稳健性以及安全性的安全的解决方案。编程

1995年,GoF(Gang of Four)合做出版了《设计模式:可复用面向对象软件的基础》一书,共收录了23种设计模式,今后创建了软件设计领域的里程碑,江湖人称[GoF设计模式]。设计模式

这23种设计模式的本质是对面向对象设计原则的运用,是对类的继承性、封装性和多态性,以及类的关联关系和组合关系的充分理解。每个模式描述了一个在咱们周围重复出现的问题,以及该问题的解决方案的核心,这样子你就能一次又一次高效地解决问题。安全

软件研发是复杂的

软件工程是复杂的,而复杂的根原本源是改变。这些改变包含客户需求的变化,技术平台的变化,开发团队的变化,市场环境的变化函数

如何解决复杂问题

人类解决复杂问题通常有两种思路:一种是分解,一种是泛化。设计

  • 分解

将复杂问题分解为一系列能解决的小问题,而后分而治之。code

  • 抽象

因为不能彻底掌握复杂对象的全部细节,所以选择忽视了它的非本质因素,而去处理泛化和理想化了模型。orm

设计模式要实现的目的

如上所述,设计模式要解决的问题是程序的复用性、可拓展性、可读性,其中最重要的就是复用性对象

可复用性

即对于不一样的模块要实现相同的功能,不该该复制代码,而是要复用代码blog

编程大师Martin Folwer说过,代码的坏味道有不少种,而首当其冲的是代码重复(duplicate code)。继承

Why Design Pattern

变化是复用的天敌,面向对象设计最大的优点在于:迎合变化

六大设计原则

设计原则比设计模式更重要。全部的设计模式都遵循设计原则,理解设计原则未来咱们本身就能设计出各类各样的涉及模式。

6大设计原则分别是:

  • 依赖倒置原则
  • 开闭原则
  • 单一职责
  • 迪米特法则
  • 里氏替换原则
  • 接口隔离原则

依赖倒置原则(DIP | Dependency Iversion Principle)

高层模块(稳定)不该该依赖于底层模块(变化),而应该依赖于抽象。
抽象(稳定)不该该依赖于具体(变化),具体应该依赖于抽象。

如第一节所说,软件设计是复杂的,复杂的缘由是开发过程当中的各类变化。虽然软件开发充满变化,可是其中仍是有不变的地方,所以就须要把变化的部分和不变的部分进行隔离。
从宏观上来讲,这里说的变化就是低层模块,稳定指的是高层模块。
从语言层面来讲,变化指的是具体的类,稳定指的是抽象,如接口、抽象类。

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

In object-oriented programming, the open/closed principle states "software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification"; that is, such an entity can allow its behaviour to be extended without modifying its source code.
--- from Wikipedia

在面向对象的编程中,开闭原则说明:软件实体(模块,类,函数等)应该对拓展开放,对修改关闭,即:一个实体可以不动他的源代码进行拓展。

意思就是:要使用拓展的方式来应对的需求的变化。

TIP

这里指的修改是二进制编译层面的,意思就是你修改了这个东西须要从新哪些文件才能够从新使用。

单一职责(SRP | Single Resonsibility Principle)

a class should only have one responsibility, which is further defined by Martin as ‘one reason to change
--- from Wikipedia

一个类应该只有一个职责。 这一原则Martin拓展为: 一个软件实体应该只有引发他改变的缘由。

迪米特法则(Law of Demeter)

Law of Demeter or Least of Knowledge is a design principle for developing software, particular Object-oriented-programs.In its general form, the LoD is a specific case of loose coupling .

  • Each unit should have only limited knowledge about other units: only units "closely" related to the current unit.
  • Each unit should only talk to its friends; don't talk to strangers.
  • Only talk to your immediate friends.

迪米特法则(又称最少知道原则)是一个软件开发的设计原则,特别是面向对象编程,软件实体之间应该尽量值暴露须要暴露的。

又称最少知道原则(Least know principles)。

里氏替换原则(LSP | Liskov Substitude Principle)

软件单元中子类应该能够替换全部的父类。 即,子类应该具备父类的全部功能。

接口隔离原则(Interface Segregation Principle)

不该该强迫客户程序依赖它们不用的方法。接口应该小而完备。

另外还有两个应该引发注意的点,虽然他们不是设计原则:

  • 优先使用对象组合,而不是继承
    • 类继承一般为了“白箱复用”,对象组合一般是“黑箱复用”
    • 继承在某种程度上破坏了封装性,子类父类耦合度高
    • 而对象组合则只要求被组合的对象具备良好定义的接口,耦合度低。
  • 封装变化点点
    • 使用封装来建立对象之间的分界层,让设计者能够在分界层的一侧修改,而不会对另外一侧产生不良的影响,从而下降类层次的松耦合。

23种设计模式分类

在面向对象的设计模式中,能够按照目的分为三类:

  • 建立型
  • 结构型
  • 行为型

具体可见以下这脑图:

相关文章
相关标签/搜索