设计模式 说明 读书笔记 从数据结构角度分析. 1:1,1:n,m:n的角度分析. 主要内容 设计模式和对比 分类解析. 创建类型 简介 顾名思义,就是用来创建对象的. 有的对象创建需要很复杂的一些操作,封装起来,只需要几个核心参数即可. 针对的是 多肽类. 工厂模式 根据key创建对应对象. 负责if else. 抽象工厂 当if else太多了,就需要拆分成多个工厂. 拆分按照特性拆分,比如地区,特征之类的拆分即可.想怎么拆都可以.只要你的逻辑能说服别人. 单例模式 创建一个对象.只能创建一个. 涉及到静态创建和动态创建,动态创建就需要考虑多线程安全和效率. 创建者模式 即给定一堆零件,用给的零件组装成为一个成品. 即组装厂,零件通过容器保存在成品对象中,即容器可以用链表,数组,数图等保存. 保存的方式符合逻辑,高效且节约内存即可. 也可以想怎么存就怎么存. 原型模式 深浅拷贝而已. 数据结构分析 工厂则是map,通过key获取value. 单例则是set,一个key就是一个类,一个类只有一个对象. 创建者模式是二维数组. a:b 工厂是1:n. 单例是1:1. 创建者是m:n. 结构性 简介 A,B两个类之间如何组合. 适配器模式 A->B,转换为目标. 既是A类型,也是B类型,即多个父类. 代理模式 A->A,同一个类型,加了点操作. 都是一个类型,但是代理的没有任何其他操作,只是做个检查什么的,然后将数据转发到另一个. 即给原来的类加了点额外的检查或者是预处理. 桥接模式 A*B组合,各自变化. 其中一个是另一个的成员变量.成员变量可以采用抽象工厂创建. 过滤器模式 多态类,主要的任务就是负责过滤. 即条件筛选,返回符合条件的. 组合模式 2-3-4树模型. 一般用于处理层次结构,只是实现略微差异. 叶子结点和根节点的差异就是,叶子结点没有子节点. 装饰器模式 链表,只是链表多了函数而已. 每个多一个处理操作. 侧重点是添加功能. 外观模式 简化对外的操作接口. 函数就是外观.因为函数为使用者做了很多的事情. 侧重点是简化,方便其他人使用. 享元模式 智能指针中的共享指针. 共享,或者说缓存. 引用计数,注意多线程安全和效率. 总览 适配器是个多面人. 代理模式是个干脏活累活的,即校准和善后之类. 桥接是各自变化的组合多面人. 装饰器是链表. 外观模式则是个老好人,简化后对外. 享元模式,对象拷贝. 组合模式适合于分阶层模型管理. A:B 适配器,1:m 代理,1:1 组合模式,l:m:n 装饰器,n. 外观模式,1. 享元模式,1. 数据交互型 责任链 链表. 只是多了函数而已. 这里采用的是递归向下,可以提前终止. 装饰器模式需要都执行. 可中断式装饰器. 命令模式 执行者可以执行多少种命令,就应该有多少种命令对象. 命令则是执行者可以执行命令的任意组合的中间类. 命令可以有多个执行者,需要执行这个命令. 解释器模式 语法二叉树. 迭代器 某个类,里面有数据,需要支持迭代. 这个类的内部类或友元类实现了标准迭代接口,并支持返回. 中介者模式 有若干个对象,需要一个系统来对这些对象进行调度处理。 公共交互平台就是一个中介者. 负责将消息收集并分发给目标. 避免直接对话. 中介可能修改数据. 备忘录 某个对象的n种状态. git可以保存文件的n种状态,并存放在数据库.随时可以恢复历史版本. 快照,容器,支持恢复. 观察者 注册,通知,被通知对象收到通知可以选择是否进行查询数据. 通知一般不包含数据,而是通知某类数据准备就绪. 状态模式 do,undo. 只支持记录一条历史记录的备忘录模式,即仅一个ctrl-z. 策略模式 get,set. 而get,set的对象是一个多肽类. 模板模式 执行流程固定,但是部分细节没有确认,可以灵活处理. 常见安卓的activity处理. 访问者模式 数据和操作分离,数据之间不存在关联. 操作只读,毕竟visitor. 多态类和重载. 多态类存在集合,遍历集合,根据重载再进行调用对应的visit函数.