设计模式不是知识点,是一种经验的总结,用来解决某些场景下的某一类问题的通用解决方案。
设计模式让代码更容易被理解,确保了复用性、可靠性、可扩展性
设计原则
- 单一职责原则:一个类,只有一个引起它变化的原因
- 开闭原则:扩展开放,修改封闭
- 里氏代替原则:子类必须替换掉它们的父类
- 依赖倒置原则:面向接口编程,而不是面向实现编程
- 接口隔离原则
- 合成复用原则:Has-A 和 Is-A
- 迪米特法则:不要和陌生人说话,最少知识原则
创建型模式
单例模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式
单例模式:
通过私有构造函数来保证类外部不能对类进行实例化,实现类只要一个实例。
创建一个返回类对象的静态方法,提供一个全局访问点。
*双重锁校验*
饿汉式(立即加载)、懒汉式(延迟加载)、生命周期托管
1 | public class Singleton |
工厂方法模式:
声明一个工厂抽象类,定义一个工厂接口。
创建派生于工厂抽象类的产品抽象类和具体产品类,由其具体子类创建对象。
1 | public abstract class Operation |
抽象工厂模式:
提供多个产品的抽象接口。
每一个具体工厂创建一个产品族中的多个产品对象,多个具体工厂就可以创建多个产品族中的多个对象。
建造者模式:
不要把产品的构造过程放在产品类中,而是由建造者类来负责构造过程,产品的内部表示放在产品类中。
原型工厂模式:
创建一个原型类,通过 MemberwiseClone() 实现浅拷贝
结构型模式
适配器模式:注重转换接口
1 | public interface IBuddhistMonk |
装饰者模式:注重稳定接口
代理模式:注重假借接口
外观模式:注重简化接口
1 | public class SubSystemOne |
桥接模式:注重分离接口和其实现
组合模式:注重统一接口
享元模式:注重保留接口
行为型模式
模板方法模式:
封装算法结构,定义算法骨架,支持算法子步骤变化
命令模式:
注重将请求封装为对象,支持请求的变化,通过将一组行为抽象为对象,实现行为请求者和行为实现者之间的解耦。
迭代器模式:
注重封装特定领域变化,支持集合的变化,屏蔽集合对象内部复杂结构,提供客户程序对它的透明遍历。
观察者模式:
注重封装对象通知,支持通信对象的变化,实现对象状态改变,通知依赖它的对象并更新。
- 简单需求,水是否烧开
1 | public class BoilWater |
- 接口实现观察者模式
1 | public class BoilWater |
- 委托和事件实现观察者模式
1 | public class BoilWater |
中介者模式:
注重封装对象间的交互,通过封装一系列对象之间的复杂交互,使他们不需要显式相互引用,实现解耦。
状态模式:
注重封装与状态相关的行为,支持状态的变化,通过封装对象状态,从而在其内部状态改变时改变它的行为。
策略模式:
注重封装算法,支持算法的变化,通过封装一系列算法,从而可以随时独立于客户替换算法。
责任链模式:
注重封装对象责任,支持责任的变化,通过动态构建职责链,实现事务处理。
访问者模式:
注重封装对象操作变化,支持在运行时为类结构添加新的操作,在类层次结构中,在不改变各类的前提下定义作用于这些类实例的新的操作。
解释器模式:
注重封装特定领域变化,支持领域问题的频繁变化,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。
备忘录模式:
注重封装对象状态变化,支持状态保存、恢复。
1 | // 观察者,外观模式 |