笔记-设计模式概述

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。

创建型模式主要用于描述如何创建对象;
结构型模式主要用于描述如何实现类或对象的组合;
行为型模式主要用于描述类或对象怎样交互以及怎样分配职责

基本设计原则

面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则。7种常用的面向对象设计原则(下图只画了6个):
在这里插入图片描述

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

一个类只负责一个功能领域中的相应职责。 一些基本指导原则:

  • 两个完全不一样的功能不应该放一个类中
  • 一个类中应该是一组相关性很高的函数、数据的封装
  • 应该不断审视自己的代码,根据具体业务、功能对类进行拆分,优化代码

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

对扩展开放,对修改关闭

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

所有引用基类的地方,必须能够使用其子类直接替换。 这个原则与面向对象的***继承***特性密切相关:

  • 子类必须实现父类的所有方法 (继承的特性,子类拥有父类的所有方法)
  • 子类可以有自己的个性 (重写)
  • 覆盖或实现父类的方法时,入参可以放大(如:父类的参数 HashMap , 子类参数可以为 Map); 输出可以被缩小(如父类 return Map, 子类 return HashMap

4.依赖倒转原则(Dependence Inversion Principle, DIP)

抽象不应该依赖于细节,细节应该依赖于抽象

  1. 高层模块不应该依赖低层模块,两者都应该依赖其抽象.不可分割的原子逻辑就是低层模式,原子逻辑组装成的就是高层模块。
  2. 抽象不应该依赖细节。java 中,抽象 -> 接口或抽象类;细节 -> 实现类
  3. 细节应该依赖抽象

精简一下就是 「面向接口编程」 ,是面向对象设计的精髓之一,可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险, 在 java 中的表现:

  • 模块间依赖通过抽象(接口)发生,实现类之间不直接依赖
  • 接口或抽象类不依赖于实现类
  • 实现类依赖于接口或抽象类

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

使用多个专门的接口,而不使用单一的总接口

客户端不应该依赖它不需要的接口。(此处接口分为实例接口即类,类接口 interface,所以此处的接口在 java 中是类和接口的意思)

建立单一的接口,不要建立臃肿庞大的接口,与 SRP 的区别:SRP 针对职责,从业务逻辑划分;ISP 是要求接口的方法尽量少。

  1. 接口尽量小
  2. 接口要高内聚。高内聚:提高接口、类、模块的处理能力,减少对外的交互,要求在接口中尽少公布 public 方法,减少对外承诺也有利于降低成本
  3. 定制服务,针对不同的用户提供优良的服务,只提供访问者需要的方法。如不同权限的用户给于不同的操作接口。
  4. 接口设计有限度的。接口粒度越小,越灵活,但是结构却越复杂,所以要有个度

6.合成复用原则(Composite Reuse Principle, CRP)

尽量使用对象组合,而不是继承来达到复用的目的

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

也称为最少知识原则(Least Knowledge Principle,LKP):「一个对象应该对其他对象有最少的了解。对类的低耦合提出了明确的要求」

  1. 只和朋友交流。例:老师叫班长清点学生,老师应该只和班长有耦合,而不应该和学生有耦合。
  2. 朋友之间也是有距离的。耦合的类不要把太多方法暴露给其它类,否则改动要修改的地方太多。(高内聚)
  3. 自己的就是自己的。如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放置在本类中。

23种设计模式

在这里插入图片描述

创建型设计模式 Creational patterns

  • 单例模式:某个类只有一个实例,提供一个全局访问点。
  • 建造者模式:封装一个复杂对象的构建过程,按照步骤构建对象。
  • 原型模式:通过复制现有的实例来创建新的实例。
  • (简单工厂模式:一个工厂类根据传入的参数决定创建哪一种产品类的实例。)
  • 工厂模式:定义一个创建对象的接口,让子类决定实例化哪个类。
  • 抽象工厂模式:创建相关依赖对象的家族,而无需指定具体类。

结构型设计模式 Structural patterns

  • 适配器模式:将一个类的方法或者接口转换成客户希望的另一个接口。
  • 装饰器模式:动态的给对象添加新的功能。
  • 代理模式:为其他对象提供一个代理以便可以控制这个对象的访问。
  • 外观模式:对外提供一个统一的方法,用来访问子系统中的一群接口。
  • 桥接模式:将抽象部分和它的实现部分相互分离,使它们都可以独立变化。
  • 组合模式:将对象组合成树形结构以表示整体和部分的层次结构。
  • 享元模式:通过共享技术来有效的支持大量细粒度的对象。

行为型设计模式 Behavioral patterns

  • 策略模式:定义一系列算法,把他们封装起来,并且使它们可以互相替换。
  • 模板方法模式:定义一个算法结构,而将一些步骤延迟到子类实现。
  • 观察者模式:对象间一对多的依赖关系。
  • 迭代器模式:一种遍历访问聚合对象各个元素的方法,不暴露给对象的内部结构。
  • 责任链模式:将请求的发送者和接收者解耦,使得多个对象都有处理这个请求的机会。
  • 命令模式:将命令请求封装成一个对象,可以将不同的请求来进行参数化。
  • 备忘录模式:在不破坏封装的前提下,保持对象的内部状态。
  • 状态模式:允许一个对象在其内部对象状态改变时改变它的行为。
  • 访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。
  • 中介者模式:用一个中介对象来封装一系列对象的交互
  • 解释器模式:给定一个语音,定义它的文法的一种表示,并定义一个解释器。

参考

猜你喜欢

转载自blog.csdn.net/shiguiyou/article/details/107502160