设计模式总结

参考

  1. 图说设计模式

面向对象设计原则

  1. 对接口编程而不是对实现编程
  2. 优先使用对象组合而不是继承

6原则

  1. 开闭原则:扩展开,修改闭
  2. 里氏代换原则:子替换父
  3. 依赖倒转原则:面向接口编程,依赖于抽象而不依赖于具体
  4. 接口隔离原则:每个接口中不存在子类用不到却必须实现的方法
  5. 迪米特法则:最少知道原则
  6. 合成复用原则:优先合成,再继承

创建型模式

1、简单工厂

  1. 简单对象的创建
  2. 子类实例化
  3. 通过if...else...生成哪个子类
  4. eg: 形状类、颜色类

2、工厂方法

  1. 每个子类在单独的方法中创建

3、抽象工厂

  1. 工厂的工厂;创建一系列相关或相互依赖对象的接口,无需指定具体的类
  2. eg: 形状、颜色类的结合

4、单例

  1. 懒汉(线程不安全)
  2. 懒汉(线程安全)
    1. 优点:不浪费内存
    2. 缺点:加锁,效率低
  3. 饿汉(类加载时初始化)
    1. 优点:没有加锁,效率高
    2. 缺点:浪费内存
  4. 双校验懒汉(双锁机制)
  5. 静态内部

5、建造者

  1. 复杂对象的创建
  2. eg:去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"
  3. eg:地图包括天空、地面、背景等组成部分,人物角色包括人体、服装、装备等组成部分

6、原型

  1. 创建重复的对象
  2. 直接创建代价比较大时,克隆已经创建的对象
  3. eg:一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用

结构型模式

1、适配器

  1. 接口转换
  2. 继承或依赖已有的对象,实现想要的目标接口。
  3. eg: 读卡器

2、桥接

  1. 抽象和实现分离
  2. 解决继承造成类的数量剧增
  3. 类有多个独立变化维度,类似多继承
  4. eg: 画不同颜色的圆、矩形等

3、过滤器

  1. 将过滤的逻辑运算解耦,结合多个标准获得一个标准

4、装饰器

  1. 向一个现有对象添加新功能,且不改变对象的结构
  2. 是继承的替代。解决子类继承后扩展功能增多后变得臃肿
  3. 动态增加些额外功能
  4. 一般将待扩展的类作为装饰器类中的成员

5、组合

  1. 类似于树结构,在一个对象中包含其他对象
  2. 缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则
  3. eg:文件目录

6、外观

  1. 添加简单的接口来隐藏系统的复杂性,降低调用者的理解成本
  2. 缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
  3. eg: 房产中介

7、享元

  1. 减少创建对象的数量,共享已有的对象
  2. eg:缓冲池

8、代理

  1. 一个类代表另一个类的功能
  2. 想在访问一个类时做一些控制
  3. 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
  4. 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

行为

1、命令

  1. 解耦请求发送者和接受者
  2. 将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化
  3. eg:电视遥控器
  4. 支持命令的撤销(Undo)操作和恢复(Redo)操作

2、中介

  1. 封装对象的交互,解耦对象间的引用
  2. 将网状结构分离为星状结构
  3. eg:聊天室
  4. 是迪米特法则的一个典型应用

3、观察者

  1. 一对多依赖关系
  2. 观察目标状态改变,相关依赖对象得到通知
  3. eg:玩家升级,任务、成就等解锁

4、状态

  1. 允许对象在内部状态发生改变时改变它的行为
  2. 条件、分支语句的代替者
  3. 主要优点在于封装了转换规则,并枚举可能的状态
  4. eg:状态机

5、策略

  1. 类的行为或算法在运行时更改
  2. 封装算法,可以相互替换
  3. 符合开闭原则
  4. 减少if...else...
  5. eg: 武器发射不同的子弹
posted @ 2018-09-10 23:57  YYRise  阅读(187)  评论(0编辑  收藏  举报