【术篇】【设计模式】 设计模式概述及其原则

1、引言来

设计模式表明了最佳的实践,一般被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程当中面临的通常问题的解决方案。这些解决方案是众多软件开发人员通过至关长的一段时间的试验和错误总结出来的。

设计模式主要是基于面向对象的如下原则:编程

  • 面向接口编程而不是实现
  • 推崇对象组合而不是继承

2、设计模式分类

共分为三大类设计模式

  1. 建立型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
  2. 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  3. 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

除以上三大类之外还有两类,即并发型模式和线程池模式。并发

3、设计模式六大原则

0.总原则-开闭原则

对扩展开放,对修改封闭。在程序须要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。即:为了使程序的扩展性好,易于维护和升级。

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

  • 核心思想:应该有且仅有一个缘由引发类的变动
  • 问题描述:假若有类Class1完成职责T1,T2,当职责T1或T2有变动须要修改时,有可能影响到该类的另一个职责正常工做。
  • 好处:类的复杂度下降、可读性提升、可维护性提升、扩展性提升、下降了变动引发的风险。
  • 需注意:单一职责原则提出了一个编写程序的标准,用“职责”或“变化缘由”来衡量接口或类设计得是否优良,可是“职责”和“变化缘由”都是不能够度量的,因项目和环境而异。

2.里氏替换原则(Liskov Substitution Principle,简称LSP)

  • 核心思想:在使用基类的的地方能够任意使用其子类,能保证子类完美替换基类。
  • 通俗来说:只要父类能出现的地方子类就能出现。反之,父类则未必能胜任。
  • 好处:加强程序的健壮性,即便增长了子类,原有的子类还能够继续运行。
  • 需注意:若是子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系 采用依赖、聚合、组合等关系代替继承。

3.依赖倒置原则(Dependence Inversion Principle,简称DIP)

  • 核心思想:高层模块不该该依赖底层模块,两者都该依赖其抽象;抽象不该该依赖细节;细节应该依赖抽象;
  • 说明:高层模块就是调用端,低层模块就是具体实现类。抽象就是指接口或抽象类。细节就是实现类。
  • 通俗来说:依赖倒置原则的本质就是经过抽象(接口或抽象类)使个各种或模块的实现彼此独立,互不影响,实现模块间的松耦合。
  • 问题描述:类A直接依赖类B,假如要将类A改成依赖类C,则必须经过修改类A的代码来达成。这种场景下,类A通常是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操做;假如修改类A,会给程序带来没必要要的风险。
  • 解决方案:将类A修改成依赖接口interface,类B和类C各自实现接口interface,类A经过接口interface间接与类B或者类C发生联系,则会大大下降修改类A的概率。
  • 好处:依赖倒置的好处在小型项目中很难体现出来。但在大中型项目中能够减小需求变化引发的工做量。使并行开发更友好。

4.接口隔离原则(Interface Segregation Principle,简称ISP)
  • 核心思想:类间的依赖关系应该创建在最小的接口上
  • 通俗来说:创建单一接口,不要创建庞大臃肿的接口,尽可能细化接口,接口中的方法尽可能少。也就是说,咱们要为各个类创建专用的接口,而不要试图去创建一个很庞大的接口供全部依赖它的类去调用。
  • 问题描述:类A经过接口interface依赖类B,类C经过接口interface依赖类D,若是接口interface对于类A和类B来讲不是最小接口,则类B和类D必须去实现他们不须要的方法。
  • 需注意:
  • 接口尽可能小,可是要有限度。对接口进行细化能够提升程序设计灵活性,可是若是太小,则会形成接口数量过多,使设计复杂化。因此必定要适度
  • 提升内聚,减小对外交互。使接口用最少的方法去完成最多的事情
  • 为依赖接口的类定制服务。只暴露给调用的类它须要的方法,它不须要的方法则隐藏起来。只有专一地为一个模块提供定制服务,才能创建最小的依赖关系。

5.迪米特法则(Law of Demeter,简称LoD)

  • 核心思想:类间解耦。
  • 通俗来说: 一个类对本身依赖的类知道的越少越好。自从咱们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚。不管是面向过程编程仍是面向对象编程,只有使各个模块之间的耦合尽可能的低,才能提升代码的复用率。低耦合的优势不言而喻,可是怎么样编程才能作到低耦合呢?那正是迪米特法则要去完成的。

6.开放封闭原则(Open Close Principle,简称OCP)

  • 核心思想:尽可能经过扩展软件实体来解决需求变化,而不是经过修改已有的代码来完成变化
  • 通俗来说: 一个软件产品在生命周期内,都会发生变化,既然变化是一个既定的事实,咱们就应该在设计的时候尽可能适应这些变化,以提升项目的稳定性和灵活性。

4、总结来

  • 单一职责原则,实现类要职责单一。
  • 里氏替换原则,不要破坏继承体系。
  • 依赖倒置原则,要面向接口编程。
  • 接口隔离原则,在设计接口的时候要精简单一。
  • 迪米特法则,要下降耦合。
  • 开闭原则是总纲,对扩展开放,对修改关闭。
相关文章
相关标签/搜索