设计模式-概念(策略模式,观察者模式,装饰者模式)
来源:互联网 发布:游戏神作 知乎 编辑:程序博客网 时间:2024/06/14 22:26
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
如果每次新的需求一来,都会使某方面的代码发生变化,那么你就可以确定,这部分的代码需要被抽出来,和其他稳定的代码有所区分。
把会变化的部分取出来并封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分。
分开变化和不会变化的部分。
学习要点:
①知道OO基础,并不足以让你设计出良好的OO系统
②良好的OO设计必须具备可复用、可扩充、可维护三个特性
③模式可以让我们建造出具有良好OO设计质量的系统
④模式呗认为是历经验证的OO设计经验
⑤模式不是代码,而是针对设计问题的通用解决方案,你可把它们应用到特定的应用中
⑥模式不是被发明,而是被发现
⑦大多数的模式和原则,都着眼于软件变化的主题
⑧大多数的模式都允许系统局部改变独立于其他部分
⑨我们常把系统中会变化的部分抽出来封装
⑩模式让开发人员之间有共享的语言,能够最大化沟通的价值
观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
在观察者模式中,会改变的时主题的状态,以及观察者的数目和类型。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题,这就叫提前规划。
主题与观察者都使用接口:观察者利用主题接口向主题注册,而主题利用观察者接口通知观察者。这样可以让两者之间运作正常,又同时具有松耦合的有点。
观察者模式利用“组合”将许多观察者组合进主题中,对象之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式而产生的。
学习要点:
①观察者模式定义了对象之间一对多的关系
②主题(也就是可观察者)用一个共同的接口来更新观察者
③观察者和可观察者之间用松耦合方式结合(loosecoupling),可观察者不知道观察者的细节,只知道观察者实现了观察者接口
④使用此模式时,你可从观察者处推(push)或拉(pull)数据,(然而,推的方式被认为更“正确”)
⑤有多个观察者时,不可以依赖特定的通知次序
⑥Java有多种观察者模式的实现,包括了通过java.util.Observable
⑦要注意java.util.Observable实现上所带来的一些问题
⑧如果有必要的话,可以实现自己的Obserable,这并不难,不要害怕
⑨Swing大量使用观察者模式,许多GUI框架也是如此
⑩此模式也被应用在许多地方,例如:JavaBeans,RMI
装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
学习要点:
①继承属于扩展形式之一,但不见得是到达弹性设计的最佳方式
②在我们的设计中,应该允许行为可以被扩展,而无须修改现有的代码
③组合和委托可用于在运动时动态地加上新的行为
④除了继承,装饰者模式也可以让我们扩展行为
⑤装饰者模式意味着一群装饰者类,这些类用来包装具体组件
⑥装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的
⑦你可以用无数个装饰者包装一个组件
⑧装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
⑨装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。
- 设计模式-概念(策略模式,观察者模式,装饰者模式)
- 策略模式+观察者模式+装饰者模式
- 设计模式---复合模式(策略-适配器-装饰者-抽象工厂-组合-观察者)
- PHP设计模式 五 (观察者 策略 装饰器模式)
- 设计模式(七)装饰者和观察者模式
- 设计模式---策略模式And 观察者模式
- 设计模式---策略模式和观察者模式
- 设计模式[策略模式和观察者模式]
- 设计模式--策略模式,装饰模式
- 设计模式笔记(二)--策略模式、观察者模式
- 设计模式(一) 观察者模式、装饰模式、工厂模式
- 设计模式 状态模式 策略模式 观察者模式 命令模式 中介者模式
- 策略模式、观察者模式
- 设计模式实现系列-策略模式-装饰模式-代理模式
- Head First设计模式之观察者,装饰者模式
- Head First设计模式---策略、观察者模式
- java 策略设计模式 装饰器模式
- 设计模式-装饰者模式
- 可折叠式标题栏+沉浸式状态栏
- 运行第一个 Service
- 使用js画布(canvas)实现倒计时特效
- leetcode 第38题:Count and Say
- OpenCV实践之路——人脸识别之一数据收集和预处理
- 设计模式-概念(策略模式,观察者模式,装饰者模式)
- Android 7.0 LowMemoryKiller 初识
- 子窗口与弹出窗口的坑使用笔记
- 卷积神经网络基础
- 12.2Groovy使用MetaClass拦截方法
- Android 5.x新特性之-Palette类
- sql一对多查询最大值的列出来
- svn中的eclipse项目转为Android studio项目
- Thopos 7 v7.1 1CD(地形测量软件)