设计模式应当是程序员的内功心法,总结的是前人的经验。可以帮助我们提升代码的可读性、可扩展性;降低维护成本,解决复杂的业务问题。但也不能为了套用设计模式而去使用设计模式。设计模式是在我们迷茫时提供的一种解决方案,或者说用好设计模式可以防范于未然。
回顾软件设计原则
说到设计模式,一定要了解软件设计原则。首先回顾一下软件设计七大原则:
设计原则 | 解释 |
---|---|
开闭原则 | 对扩展开放,对修改关闭 |
依赖倒置原则 | 通过抽象使个各类或者模块不互相影响,实现松耦合 |
单一职责原则 | 一个类、接口、方法只做一件事 |
接口隔离原则 | 尽量保证接口的纯洁性,客户端不应该依赖不需要的接口 |
迪米特法则 | 又叫最少知道原则,一个类对其所有依赖的类知道的越少越好 |
里氏替换原则 | 子类可以扩展父类的功能,不能改变父类原有的功能 |
合成复用原则 | 尽量使用对象组合,聚合,而不是使用继承关系达到代码的复用目的 |
设计模式的分类
创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。
结构型模式:把类或对象结合在一起形成一个更大的结构。
行为型模式:类和对象如何交互,及划分责任和算法。
分类 | 设计模式 |
---|---|
创建型 | 工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式 |
结构型 | 适配器模式、桥接模式、组合模式、装饰器模式、门面模式、享元模式、代理模式 |
行为型 | 解释器模式、模板方法模式、责任链模式、命令模式、迭代器模式、调节者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式 |
我自己总结了其中的一部分:
[设计模式] - 工厂模式(Factory Pattern)简单到复杂之路
[设计模式] - 单例模式(Singleton Pattern)全方式解析
[设计模式] - 原型模式 拔一根毫毛吹出猴万个
[设计模式] - 代理模式 静态代理和动态代理(JDK和CGLib)实现
[设计模式] - 委派模式 注重结果的老板
[设计模式] - 策略模式 多算法选择的福音
[设计模式] - 模板方法 把大象放冰箱,拢共分几步?
[设计模式] - 适配器模式 亡羊补牢,犹未晚矣
[设计模式] - 装饰者模式 要要切割闹,煎饼果子来一套
[设计模式] - 观察者模式 “三年二班周杰伦,马上到训导处来”
我知道自己写的也不太好之后也会不断改进,希望看到错误和有建议的同学能留言提点一二。
设计模式之间的关联关系和对比
在平时我们写代码的时候,通常是多个实际模式叠加使用。
- 单例模式和工厂模式
- 实际业务代码中,通常会把工厂模式设计为单例的
- 策略模式和工厂模式
- 工厂模式包含工厂方法模式和抽象工厂模式,他们都是创建型,策略模式属于行为型模式。
- 工厂模式主要目的是封装好创建逻辑,策略模式接收工厂模式创建好的对象,从而实现不同的行为。
- 策略模式和委派模式
- 策略模式是委派模式内部的一种实现形式,策略模式惯出的结果是否能互相替代。
- 委派模式更关注分发和调度的过程。
- 模板方法模式和工厂方法模式
- 工厂方法是模板方法的特殊实现。
- 模板方法模式和策略模式
- 模板方法和策略模式都是封装算法。
- 策略模式是使不同算法可以互相替换,且不影响客户端使用。
- 模板方法是针对定义一个算法流程,将一些有细微差异的部分交给子类实现。
- 模板方法不能改变算法流程,策略模式可以改变算法流程且可替换。
- 装饰者模式和静态代理模式
- 装饰者模式关注点在于给对象动态添加方法,而代理模式注重控制对象的访问。
- 代理模式通常会再代理类中创建被代理对象的实例,而装饰者模式通常把被装饰者作为构造参数
- 装饰者和代理这虽然都持有对方的引用,但逻辑处理重心不同。
- 装饰者模式和适配器模式
- 装饰者模式和适配器模式都属于包装器模式
- 装饰者模式可以实现被包装对象相同接口或把继承被装饰者作为他的子类,而适配器和被适配者可以实现不同的接口。
- 适配器模式和静态代理模式
- 适配器可以结合代理模式来实现,保存被适配对象的引用,但不是唯一的实现方式。
- 适配器模式和策略模式
- 在适配业务复杂的情况下,应该使用策略模式优化动态适配逻辑。