设计模式总结
目录
参考
面向对象设计原则
- 对接口编程而不是对实现编程
- 优先使用对象组合而不是继承
6原则
- 开闭原则:扩展开,修改闭
- 里氏代换原则:子替换父
- 依赖倒转原则:面向接口编程,依赖于抽象而不依赖于具体
- 接口隔离原则:每个接口中不存在子类用不到却必须实现的方法
- 迪米特法则:最少知道原则
- 合成复用原则:优先合成,再继承
创建型模式
1、简单工厂
- 简单对象的创建
- 子类实例化
- 通过if...else...生成哪个子类
- eg: 形状类、颜色类
2、工厂方法
- 每个子类在单独的方法中创建
3、抽象工厂
- 工厂的工厂;创建一系列相关或相互依赖对象的接口,无需指定具体的类
- eg: 形状、颜色类的结合
4、单例
- 懒汉(线程不安全)
- 懒汉(线程安全)
- 优点:不浪费内存
- 缺点:加锁,效率低
- 饿汉(类加载时初始化)
- 优点:没有加锁,效率高
- 缺点:浪费内存
- 双校验懒汉(双锁机制)
- 静态内部
5、建造者
- 复杂对象的创建
- eg:去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"
- eg:地图包括天空、地面、背景等组成部分,人物角色包括人体、服装、装备等组成部分
6、原型
- 创建重复的对象
- 直接创建代价比较大时,克隆已经创建的对象
- eg:一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用
结构型模式
1、适配器
- 接口转换
- 继承或依赖已有的对象,实现想要的目标接口。
- eg: 读卡器
2、桥接
- 抽象和实现分离
- 解决继承造成类的数量剧增
- 类有多个独立变化维度,类似多继承
- eg: 画不同颜色的圆、矩形等
3、过滤器
- 将过滤的逻辑运算解耦,结合多个标准获得一个标准
4、装饰器
- 向一个现有对象添加新功能,且不改变对象的结构
- 是继承的替代。解决子类继承后扩展功能增多后变得臃肿
- 动态增加些额外功能
- 一般将待扩展的类作为装饰器类中的成员
5、组合
- 类似于树结构,在一个对象中包含其他对象
- 缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则
- eg:文件目录
6、外观
- 添加简单的接口来隐藏系统的复杂性,降低调用者的理解成本
- 缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
- eg: 房产中介
7、享元
- 减少创建对象的数量,共享已有的对象
- eg:缓冲池
8、代理
- 一个类代表另一个类的功能
- 想在访问一个类时做一些控制
- 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
- 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
行为
1、命令
- 解耦请求发送者和接受者
- 将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化
- eg:电视遥控器
- 支持命令的撤销(Undo)操作和恢复(Redo)操作
2、中介
- 封装对象的交互,解耦对象间的引用
- 将网状结构分离为星状结构
- eg:聊天室
- 是迪米特法则的一个典型应用
3、观察者
- 一对多依赖关系
- 观察目标状态改变,相关依赖对象得到通知
- eg:玩家升级,任务、成就等解锁
4、状态
- 允许对象在内部状态发生改变时改变它的行为
- 条件、分支语句的代替者
- 主要优点在于封装了转换规则,并枚举可能的状态
- eg:状态机
5、策略
- 类的行为或算法在运行时更改
- 封装算法,可以相互替换
- 符合开闭原则
- 减少if...else...
- eg: 武器发射不同的子弹