设计模式导论

什么是 GOF?

在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。

  • 对接口编程而不是对实现编程。
  • 优先使用对象组合而不是继承。

设计模式的基石

  • 封装 顺序
  • 继承 判断
  • 多态 循环

设计模式总览

设计模式是一种思想,灵活运用思想远大于死记代码、咬文爵字

创建型模式(Creational Patterns)

  • 单例(Singleton)模式 :保证一个对象
  • 原型(Prototype)模式 :快速克隆一个自己
  • 简单工厂(一个方法):if-else判断创建对象。产品线单一
  • 工厂方法(FactoryMethod)(很多方法)模式:每个产品一个方法就行
  • 抽象工厂(AbstractFactory)模式:很多工厂+很多方法
  • 建造者(Builder)模式:每一个建造细节都可以传入,但是都不是必须,如果必须就构造器强制

结构型模式(Structural Patterns)

  • 代理模式(Proxy):动态代理+cglib
  • 适配器模式(Adapter):连接两个不同接口
  • 桥接模式(Bridge):链接同一个东西的两个不同维度
  • 装饰模式(Decorator):静态代理=装饰。被装饰的对象传入
  • 外观(Facade):把多个类 的多个方法。合成到一个类里面引用
  • 享元(Flyweight):将原对象通过池技术共享
  • 组合(Composite):A里面属性有B对象就是组合
  • 过滤器模式(Filter Pattern)

行为型模式(Behavioral Patterns)

  • 模板方法(Template Method)模式:父类定义了一个大方法,里面调用了一堆小方法步骤,小方法步骤子类实现即可
  • 策略(Strategy)模式:每一种算法封装成一个策略。别人-》策略对象.方法调用
  • 命令(Command)模式
  • 职责链(Chain of Responsibility)模式:Filter、维护链条+游标+递归
  • 状态(State)模式:和策略很像,状态要维护状态扭转
  • 观察者(Observer)模式:吧所有观察者List起来,然后foreach调用
  • 中介者(Mediator)模式:所有类都引入一个类的对象,通过这一个对象调用
  • 迭代器(Iterator)模式:自定义遍历算法,自己本类的迭代器遍历自己本类里面的集合
  • 访问者(Visitor)模式:
  • 备忘录(Memento)模式:吧复杂对象的关键属性抽取出来进行保存
  • 解释器(Interpreter)模式:语法分析,大解析器组合了很多小解释器,进行语法解析

组件的生命周期

image.png

设计的7大原则

1.开闭原则(Open Closed Principle,OCP):

软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification)合成复用原则、里氏替换原则相辅相成,都是开闭原则的具体实现规范,
扩展新类而不是修改旧类

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

继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)
继承父类而不去改变父类

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

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)
面向接口编程,而不是面向实现类

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

一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)
每个类只负责自己的事情,而不是变成万能

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

一个类对另一个类的依赖应该建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)。
各个类建立自己的专用接口,而不是建立万能接口

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

最少知识原则(Least Knowledge Principle,LKP)只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)
无需直接交互的两个类,如果需要交互,使用中间者过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低

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

又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
优先组合,其次继承