多年后, 再次翻阅设计模式书籍, 将每种模式的要点总结于此, 需要本身有一定设计模式基础, 再结合要点, 帮助更好理解与运用.

  • 策略模式 (Strategy)

    • 附加功能单独抽象不同接口
    • 功能以组合方式引入抽象类
    • 抽象类封装功能模块各调用
    • 实现类可在构造中配置功能具体实现
  • 观察者模式 (Observer)
    • 被订阅者持有所有订阅者
    • 数据更新可以直接推送
    • 数据更新也可以通知加拉取
    • 大程度解耦观察者与被订阅者
  • 装饰器模式 (Decorator)
    • 装饰器接口的简单实现叫做组件
    • 持有组件对象的叫做装饰器
    • 装饰是从里层的装饰器开始
    • 最里层的装饰器会持有原始组件
    • 各层通过对持有的底层对象进行包装完成所谓装饰并返回给上层
    • 理论上可以做到一层套一层无穷尽
  • 工场方法模式 (Factory Method)
    • 解耦产品的实现与使用
    • 产品需要进行抽象
    • 工场方法定义创建产品的接口
    • 工场方法内还可以封装使用过程
    • 子工场配置自己的创建逻辑
    • 工场方法常常与抽象工场结合
    • 抽象工场定义了一组产品的创建
    • 工厂方法的实现又用这些产品创建或组件具体的大产品
    • 工厂方法通过继承来实现
    • 抽象工场通过组合来实现(传入)
  • 单例模式 (Singleton)
    • 全局实例注意内存
    • 多线程需要特殊照顾
  • 命令模式 (Command)
    • 解耦发请求者与执行请求者
    • 命令内部可以直接执行也可以代理给被封装在内的接收者
    • 命令支持撤销
    • 宏命令包含多个命令同时调用
  • 适配器模式 (Adapter)
    • 对象适配器以组合来实现
    • 类适配器以多继承来实现
    • 新旧系统共用可双向适配
  • 外观模式 (Facade)
    • 从抽象层次看与适配器很像
    • 外观模式创建新的简单接口
    • 适配器模式使用已存在接口
    • 新接口包装多个系统模块简化调用
    • 老接口包装其他系统达到兼容
  • 模板方法模式 (Template Method)
    • 模板实现算法, 子类实现步骤
    • 子类与父类尽量不能成环
    • 好莱坞模式为子类全为回调方法
    • 有默认实现的为钩子方法
    • 策略用组合封装算法,模板用继承封装算法
    • 工厂方法是特殊的模板方法
  • 迭代器模式 (Iterator)
    • 解耦游走数组而不要关心具体类型
    • 集合类都有自己的迭代器
    • 一般的迭代器具备hasNext与next两个方法
    • 聚合器持有数据并创建迭代器
  • 组合模式 (Composite)
    • 组合模式的节点分为子节点与叶节点
    • 子与叶都实现了同样的组合接口,所谓透明性
    • 子节点会额外实现add与get
    • 为了叶节点安全也可以具有不同接口
    • 组合模式可以与迭代器共生
    • 迭代器需要配合栈来实现树的遍历
    • 子节点可以实现空迭代器来减少Null判断
  • 状态模式 (State)
    • 与策略模式类图相似
    • 状态接口定义状态切换行为
    • 所有状态实现统一接口
    • 状态机定义并持有所有状态
    • 状态机储存当前状态
    • 状态切换由不同状态自己控制
    • 状态内通过持有的状态机来切换下一状态
  • 代理模式 (Proxy)
    • 可分为远程代理与虚拟代理
    • 与装饰者很像
    • 代理更多的是控制真实对象的访问, 解耦客户与真实对象, 也可能帮助创建真实对象
    • 装饰器更多是增加行为, 而且不创建对象
    • 可通过工厂方法返回主体的代理
    • 与适配器很像
    • 代理不改变接口, 适配器改变接口
    • 保护代理可以限制访问部分接口,更像适配器
  • 复合模式 (Compound)
    • 多用几种
    • 比如MVC就融合了策略,组合,适配器等

  • 一些冷门模式

  • 桥接模式 (Bridge)
    • 与策略模式很像
    • 主体都依赖于功能组件的抽象
    • 策略模式的主体是具体算法的实现
    • 桥接模式的主更抽象,需要子类来实现不同算法
    • 可以做到主体和功能组件解耦
    • 增加了复杂度
  • 生成器 (Builder)
    • 封装复杂对象的创建过程
    • 隐藏内部实现
    • 创建时需要对所创对象有更多认识
  • 责任链 (Resposibility)
    • 简单理解为一个Handler的对象链
    • 比如很多程序里常用的Dispatcher链
    • 或者很多系统启动时需要加载的数据链
    • 不能保证一定会有对象对数据进行处理
  • 享元 (Flyweight)
    • 多个同样的实例可被一个方法控制, 就可以封装在一起轮询数组进行处理
    • 但是不能有独立不同行为了
  • 解释器 (Interpreter)
    • 主要是做简单固定语法解析
    • 抽象解释接口, 并实现多个解释器
    • 如And, Or之类的, 可相互嵌套.
    • 如果语法复杂, 种类繁多, 会不太适合
  • 中介者 (Mediator)
    • 解耦不同对象
    • 它们只需要通知中介者, 中介者根据不同状态来控制整个逻辑
    • 可能会让中介者逻辑过于复杂
  • 备忘录 (Momento)
    • 将对象的储存抽出来, 更好的维护了业务的内聚
    • 一般会提供储存与获取接口
    • 储存过程可能会耗时
    • 可能需要考虑序列化
  • 原型 (Prototype)
    • 提供复制对象的方法
    • 比如clone
    • 如果对象层次深,复制起来可能复杂
  • 访问者 (Visitor)
    • 解耦对象与每个对象的具体操作, 如对电脑的不同部件进行不同操作
    • 在对象种类变化小而操作变化大的时候使用
    • 每一个对象实现visitor接口, 接受(accept)一个visitor,并把自己传给visitor (visit)
    • 缺点是具体元素对访问者暴露, 而不是抽象接口

有很多种分类方式, 不必拘泥, 也可忽略.

  • 分类方式 I

    • 创建型

      • 单例
      • 抽象工厂
      • 工厂方法
      • 生成器
      • 原型
    • 行为型
      • 模板方法
      • 迭代器
      • 状态
      • 策略
      • 观察者
      • 命令
      • 解释器
      • 中介者
      • 访问者
      • 备忘录
      • 责任链
    • 结构型
      • 装饰器
      • 代理
      • 外观
      • 组合
      • 适配器
      • 桥接
      • 享元
  • 分类方式 II
      • 模板方法
      • 工厂方法
      • 适配器
      • 解释器
    • 对象
      • 单例
      • 抽象工厂
      • 装饰器
      • 代理
      • 外观
      • 组合
      • 适配器
      • 迭代器
      • 状态
      • 策略
      • 观察者
      • 命令
      • 桥接
      • 享元
      • 生成器
      • 中介者
      • 访问者
      • 备忘录
      • 责任链
      • 原型

Refresh design pattern的更多相关文章

  1. [转]Design Pattern Interview Questions - Part 4

    Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...

  2. java设计模式大全 Design pattern samples in Java(最经典最全的资料)

    java设计模式大全 Design pattern samples in Java(最经典最全的资料) 2015年06月19日 13:10:58 阅读数:11100 Design pattern sa ...

  3. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  4. 设计模式(Design Pattern)系列之.NET专题

    最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...

  5. [转]Design Pattern Interview Questions - Part 2

    Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...

  6. [转]Design Pattern Interview Questions - Part 3

    State, Stratergy, Visitor Adapter and fly weight design pattern from interview perspective. (I) Can ...

  7. [转]Design Pattern Interview Questions - Part 1

    Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...

  8. design pattern

    1. visitor design pattern http://butunclebob.com/ArticleS.UncleBob.IuseVisitor

  9. Design Pattern: Observer Pattern

    1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...

随机推荐

  1. HTML+CSS的小实例

    通过一个月以来对HTML5+CSS的学习.这篇随笔给大家来做一个简单的网页中常见的导航栏. 这些都称之为网页中的导航栏. 我简单的做了一个某宝和58同城的导航栏,供大家学习参考. 一.58同城导航栏: ...

  2. 188W+程序员关注过的问题:Java到底是值传递还是引用传递?

    在逛 Stack Overflow 的时候,发现了一些访问量像阿尔卑斯山一样高的问题,比如说这个:Java 到底是值传递还是引用传递?访问量足足有 188万+,这不得了啊!说明有很多很多的程序员被这个 ...

  3. segment树(线段树)

    线段树(segment tree)是一种Binary Search Tree或者叫做ordered binary tree.对于线段树中的每一个非叶子节点[a,b],它的左子树表示的区间为[a,(a+ ...

  4. std::unique_ptr的用法

    std::ofstream("demo.txt") << 'x'; // 准备要读的文件 { std::unique_ptr<std::FILE, decltyp ...

  5. 简单理解http协议的特性

    http协议一种数据传输的规范,像我们的在发送数据的时候,我们无法保证发送与接收的类型是一致的,它就保证了我们传输的同一个类型数据. 特性: 1.灵活:我们不管传输什么数据,图片,文件,文字,都可以进 ...

  6. NSUserdefaults清除存储内容

    有两种方式 方式一:找到所有的key,然后删除对象 /** *  清除所有的存储本地的数据 */ - (void)clearAllUserDefaultsData { NSUserDefaults * ...

  7. uglify-js 和uglify-es

    uglify-js 它不支持压缩 es6,参考github的issue It seems like uglify-js does not support es6? uglify-js在压缩代码时,遇到 ...

  8. Ceph 概述和理论

    1.1 Ceph概述 官网地址:https://docs.ceph.com/docs/master/ 1.Ceph简介 概述:Ceph是可靠的.可扩展的.统一的.分布式的存储系统.同时提供对象存储RA ...

  9. 将object转换成dyamic类型 解决long输出到浏览器过长精度丢失问题

    需求: 数据库使用飘雪算法保存唯一标识  是一个18位长整形 将数据输出到浏览器时出现了精度丢失问题,这是一个重大的BUG.如果没解决好整个项目都要改一遍. 讨论有三个办法 1.把所有实体 数据模型的 ...

  10. Spring、SpringMVC、SpringBoot、SpringCloud的区别与联系

    前言 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.Spring使你能够编写更干净.更可管理.并且更易于测试的代码. Spring MVC是Spring的一个模块,一个w ...