设计模式(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)
抽象不应该依赖于细节,细节应该依赖于抽象
- 高层模块不应该依赖低层模块,两者都应该依赖其抽象.不可分割的原子逻辑就是低层模式,原子逻辑组装成的就是高层模块。
- 抽象不应该依赖细节。java 中,抽象 -> 接口或抽象类;细节 -> 实现类
- 细节应该依赖抽象
精简一下就是 「面向接口编程」 ,是面向对象设计的精髓之一,可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险, 在 java 中的表现:
- 模块间依赖通过抽象(接口)发生,实现类之间不直接依赖
- 接口或抽象类不依赖于实现类
- 实现类依赖于接口或抽象类
5.接口隔离原则(Interface Segregation Principle, ISP)
使用多个专门的接口,而不使用单一的总接口
客户端不应该依赖它不需要的接口。(此处接口分为实例接口即类,类接口 interface,所以此处的接口在 java 中是类和接口的意思)
建立单一的接口,不要建立臃肿庞大的接口,与 SRP 的区别:SRP 针对职责,从业务逻辑划分;ISP 是要求接口的方法尽量少。
- 接口尽量小
- 接口要高内聚。高内聚:提高接口、类、模块的处理能力,减少对外的交互,要求在接口中尽少公布 public 方法,减少对外承诺也有利于降低成本
- 定制服务,针对不同的用户提供优良的服务,只提供访问者需要的方法。如不同权限的用户给于不同的操作接口。
- 接口设计有限度的。接口粒度越小,越灵活,但是结构却越复杂,所以要有个度
6.合成复用原则(Composite Reuse Principle, CRP)
尽量使用对象组合,而不是继承来达到复用的目的
7.迪米特法则(Law of Demeter, LoD)
也称为最少知识原则(Least Knowledge Principle,LKP):「一个对象应该对其他对象有最少的了解。对类的低耦合提出了明确的要求」
- 只和朋友交流。例:老师叫班长清点学生,老师应该只和班长有耦合,而不应该和学生有耦合。
- 朋友之间也是有距离的。耦合的类不要把太多方法暴露给其它类,否则改动要修改的地方太多。(高内聚)
- 自己的就是自己的。如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放置在本类中。
23种设计模式
创建型设计模式 Creational patterns
- 单例模式:某个类只有一个实例,提供一个全局访问点。
- 建造者模式:封装一个复杂对象的构建过程,按照步骤构建对象。
- 原型模式:通过复制现有的实例来创建新的实例。
- (简单工厂模式:一个工厂类根据传入的参数决定创建哪一种产品类的实例。)
- 工厂模式:定义一个创建对象的接口,让子类决定实例化哪个类。
- 抽象工厂模式:创建相关依赖对象的家族,而无需指定具体类。
结构型设计模式 Structural patterns
- 适配器模式:将一个类的方法或者接口转换成客户希望的另一个接口。
- 装饰器模式:动态的给对象添加新的功能。
- 代理模式:为其他对象提供一个代理以便可以控制这个对象的访问。
- 外观模式:对外提供一个统一的方法,用来访问子系统中的一群接口。
- 桥接模式:将抽象部分和它的实现部分相互分离,使它们都可以独立变化。
- 组合模式:将对象组合成树形结构以表示整体和部分的层次结构。
- 享元模式:通过共享技术来有效的支持大量细粒度的对象。
行为型设计模式 Behavioral patterns
- 策略模式:定义一系列算法,把他们封装起来,并且使它们可以互相替换。
- 模板方法模式:定义一个算法结构,而将一些步骤延迟到子类实现。
- 观察者模式:对象间一对多的依赖关系。
- 迭代器模式:一种遍历访问聚合对象各个元素的方法,不暴露给对象的内部结构。
- 责任链模式:将请求的发送者和接收者解耦,使得多个对象都有处理这个请求的机会。
- 命令模式:将命令请求封装成一个对象,可以将不同的请求来进行参数化。
- 备忘录模式:在不破坏封装的前提下,保持对象的内部状态。
- 状态模式:允许一个对象在其内部对象状态改变时改变它的行为。
- 访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。
- 中介者模式:用一个中介对象来封装一系列对象的交互
- 解释器模式:给定一个语音,定义它的文法的一种表示,并定义一个解释器。