Section 11 代理模式 Proxy
控制和管理访问
代理模式 为另一个对象提供一个替身或占位符以控制对这个对象的访问.
使用代理模式创建代表representative对象, 让代表对象控制某对象的访问, 被代理的对象可以是远程的对象, 创建开销大的对象或需要安全控制的对象.
>远程代理Remote Proxy 隐藏远程细节, 调用代理的方法, 远程代理利用网络转发到远程执行, 结果通过网络返回给代理, 由代理将结果转给客户.
GumballMachineRemote GumballMonitor
>虚拟代理Virtual Proxy 作为开销大的对象的代表, 当对象在创建前和创建中时, 由虚拟代理来代替对象, 对象创建后代理会将请求直接委托给对象.
ImageProxy
>保护代理Protection Proxy 不同的客户对于一个对象有不同的访问权限, 保护代理向不同的客户提供不同的访问权限. (Java动态代理)
PersonBean InvocationHandler
>其他代理
防火墙代理Firewall Proxy 控制网络资源的访问, 保护主题免受侵害
智能代理SmartReference Proxy 当主题被引用时, 进行额外的操作, 例如计算引用次数
缓存代理Caching Proxy 为开销大的计算结果提供暂时存储, 允许共享结果以减少计算时间和网络延迟
同步代理Synchronization Proxy 多线程的情况下为主题提供安全的访问
复杂隐藏代理ComplexityHiding Proxy 隐藏一个类的复杂集合的复杂度, 进行访问控制. 也成为外观代理Facade Proxy.
写入时复制代理CopyOnWirte Proxy 控制对象的复制, 方法是延迟对象的复制直到客户真正需要为止.
Summary
>要点 代理模式为另一个对象提供代表, 以便控制客户对对象的访问, 管理访问的方式有多种; 远程代理客户和远程对象之间的交互; 虚拟代理控制访问实例化开销大的
对象; 保护代理基于调用者控制对对象方法的访问; 代理在结构上类似装饰者, 目的不同; 装饰者为对象加上行为, 代理是控制访问; 代理增加实际中类的数目(Wrapper).
InvocationHandler, Virtual, Detour, Rmiregistry, MethodInvocation, Protection, Decorator, Skeleton, Remote, Dynamic, WebProxy, Stub
---Section 11 End---
Section 12 复合模式 Combining
>模式的模式 Compound Pattern
>复合模式通常被一起使用, 组合在同一个设计方案中, 结合多个模式解决一般或者重复发生的问题.
MVC 模型-视图-控制器
>视图 呈现模型 通常直接从模型中取得需要显示的数据和状态
>控制器 取得用户的输入并解读其对模型的影响
>模型 持有所有的数据 状态 程序逻辑, 提供操作和检索的接口, 发送状态改变通知给观察者
视图是控制器的窗口, 控制器解读用户的动作, 通知模型进行相应的反馈和改变; 控制器也会要求视图作出相应的改变, 视图会从模型取得显示的状态, 作出相应改变.
>控制器的功能 通知模型 解读输入操作模型, 可以减低视图代码的复杂度, 帮助模型和视图解耦合, 有利于视图复用于其他模型, 使得设计容易扩展.
策略模式 视图和控制器 视图是对象 控制器是策略
观察者模式 视图是模型的观察者
组合模式 视图是一个树形的UI组合
Summary
>OO模式 复合模式结合两个或以上的模式组成一个解决方案, 解决一再发生的一般性问题.
>要点 MVC是复合模式, 结合了策略 观察者 组合; 模型使用观察者, 通知更新 保持解耦合; 控制器是是视图的策略, 视图可以使用不同控制器得到不同的行为; 视图使用组合模式
UI通常是嵌套组件panel frame button; 模式帮助MVC的三层解耦; 适配器可以将新的模型适配已有的视图和控制器;
---Section 12 End---
Section 13 真实世界的模式 For Real
模式 在某种情境Context下 针对某问题的某种解决方案
>情镜 应用某个模式的情况 >问题 希望在某个情境下达到的目的 或者某个情境下的约束 >解决方案 通用的设计
模式的描述 >Name 共享交流的名称 >Catalog 模式的类目 >Intent 意图 简短描述模式的作用 >Motivation 动机 给出问题场景以及如何解决 >Applicability 适用性 描述应用场合
>Structure 结构 提供类图 显示类之间的关系 >Participants 参与者 描述在设计中涉及到的对象和类在模式中的责任和角色 >Collaborations 协作 参与者如何合作 >Consequences
结果 可能产生的效果 好的方面和不好的 >Implementation/Sample Codes 实现 提供所需的技巧 需要研究的问题 示例代码 提供代码片段 帮助实现 >Known Use 已知应用 描述在
真实系统中发现的模式例子 >Related Patterns 相关模式 描述和其他模式之间的关系
模式类目
>创建型 涉及对象实例化 提供一个方法 将客户从所需要实例化的对象中解耦 Singleton AbstractFactory FactoryMethod (Builder Prototype)
>行为型 涉及类和对象如何交互分配职责 TemplateMethod Iterator Command Observer State Strategy (Mediator Vistor Interpreter Memento ChainOfResponsibility)
>结构型 把类和对象组合到更大的结构中 Proxy Decorator Facade Composite Adapter (Flyweight Bridge)
另一种分类方式 模式处理的是类还是对象
>类模式描述类之间的关系如何通过继承定义 在编译时建立关系 TemplateMethod FactoryMethod Adapter Interpreter
>对象模式描述对象之间的关系 主要利用组合定义 在运行时建立关系 更加有弹性 others...
使用指南 保持简单 KISS keep it simple 在合适和需要的地方使用模式, 在可简化的地方使用简单方式; 设计时考虑模式, 重构时也要考虑模式; 需要的时候可以删除模式简化系统;
不同领域的模式 >架构模式 建立城镇建筑城市的架构 >应用模式 建立系统级架构的模式 多层架构 >领域特定模式 特定领域 并发系统或实时系统 >业务流程模式 描述业务 顾客和数据
之间的交互 决策和沟通 >组织模式 人类组织的结构以及实践 >UI设计模式 解决交互式软件的设计问题
反模式 采用一个不好的解决方案解决一个问题 反模式看起来像一个好的解决方案, 采用后却会带来麻烦, 通过将反模式归档, 分辨出不好的解决方案
Summary
>要点 让设计模式自然得出现在设计需要的地方, 不是为了模式而模式; 根据需要采用或者修改模式; 选择最简单的方案, 不管是否使用模式; 模式类目帮助学习理解; 需要时间和耐心来
提炼精化模式; 模式是发现的, 大多数模式是现有模式的变体; 模式帮助统一化共享名词;
模式定义
>装饰者 包装对象提供新的行为 >状态 封装基于状态的行为 使用委托在状态间切换 >迭代器 在对象集合中遍历 不暴露集合的实现 >外观 简化一群类的接口 >策略 封装可以互换的行为
使用委托来决定使用哪个 >代理 包装对象 控制对此对象的访问 >工厂方法 由子类决定要创建的具体类是哪个 >适配器 封装对象 提供不同的接口 >观察者 让对象在状态改变时被通知
>模板方法 由子类决定如何实现算法中的步骤 >组合 客户使用一致的方式处理对象集合和单个对象 >单件 确保只有一个对象被创建 >抽象工厂 允许客户创建对象的家族 无需指定他们
的具体类 >命令 封装请求成为对象
---Section 13 End---