设计模式——装饰者/策略/观察者模式

装饰者模式

装饰者模式:简单的理解就是在原有对象上包装一层附件动作,且保持包装完后的对象与被包装者属于同一个类族,但是额外附加了该包装类所特定的动作。

其关键点有:

  1. 包装类对象HAS-A被包装对象;
  2. 包装类与被被包装对象属于同一个类族,即都有相同的超类型;
  3. 包装可以嵌套/可以被多次包装,即某被包装者被包装类A包装之后产生的对象还可以继续被其他包装类包装,包括上一层包装类A

包装模式所体现的“对扩展开放,对修改关闭”原则:

  1. 对扩展开放:通过包装,原被包装对象有了包装类指定的扩展行为,可以用于原被包装对象的场合(当然前提是那是基于接口设计的代码)
  2. 对修改关闭:不用修改已有的代码即可以实现功能的扩展。

使用包装者模式与使用继承的区别:使用包装者模式可以动态的添加行为,使用继承则是静态的,是编译时确定的。假设使用继承模式,则必须对每一种可能存在的行为组合都写一个专门的类来表示,即你的代码能够表示的行为组合的种类是由你设计的类决定的,客户无法得到你设计之外的组合模式;而使用包装者模式,你只需把所有可能的基本行为写好,而这些行为怎么去组合,则完全由客户根据自己的需要决定。

装饰者模型的缺点:

  1. 可能会加入大量的小类或者存在很多的对象;
  2. 对于某些依赖于特定类型的代码的,包装者就会失效。

类模型:

策略模式

策略模式:定义算法族,分别封装起来,让他们之间可以互相替换,以让算法的变化独立于使用算法的客户代码。其出发宗旨就是:封装变的部分!

要点:

  1. 定义多个算法,即多个实现方案;
  2. 各个算法之间可以替换,一般实现方式是让所有算法实现某个接口,且在客户代码中针对接口编程;
  3. 算法的变化独立于使用者:可以更改算法的实现代码,但是使用者代码确不用任何更改;可以设置使用者使用的具体实现算法

使用案例:假使定义一个Coder类,不同的Coder有不同的writeBolg方式,那么根据策略模式的思路,其类模型如下:还可以在Coder中添加set(WriteBlog)方法以动态的设置策略

优势:假使有这么一个需求:有CoderA,COderB,CoderC,COderD四种Coder,其中A,B使用InCnblog,C,D使用InCsdn,那么假使使用继承来解决,那么可能分别需要在CoderA,COderB中以InCnblog的方式重写writeBlog,在CoderC,COderD中以InCsdn的方式重写writeBlog,显然,产生了重复的代码。而且,当以后以InCsdn的实现方案变了,那么就需要在CD两个类中去维护。再进一步,如果CoderB突然想以InCsdn方式写博客了,继承的方式可能就难以应付。而使用策略模式则可以很好的解决这些问题。

观察者模式

观察者模式:定义对象之间的一对多依赖,当一个对象改变状态时,它所有的依赖者都会收到通知并自动更新。

要点:

  1. 一对多:避免多个对象控制同一个数据
  2. 可注册可移除:让被观察者与观察者之间的耦合尽量最低

简单的观察者模型:

  1. 消息更新的方式有两种。一种是pull,即在Oberver中调用getData方法获取自己想要的数据,方便按需索取;一种是push,即在update方法中(此时update则必须有参数),把所有的数据类型都一次性传给Oberver,比较方便,也是用的更多的方式;
  2. 为什么在observer要有subject的引用:用于移除自己的注册;
  3. 不要依赖于观察者被通知的顺序:由于我们设计的目的就是松耦合,所以如果subject做了某些改变导致通知的顺序变了,假如在obsever中存在某种对通知顺序的依赖,那么observer则也必须做出相应的改变以适应subject的改变,这样是不符合设计初衷的
  4. 在java.util.Observable提供观察者模型,http://www.android-doc.com/reference/java/util/Observable.html, 需要注意的事,必须先调用setChanged()才会通知才会有效,因为在notifyObservers的方法中,要先检查changed为true才会通知obervers。这样的设计可以让通知模式有更多弹性,比如对于气象站的源数据数据,可能是实时更新,但是对于观察者来说可能每小时更新一次就够了,那么就可以每一小时调用一次setChanged().
时间: 2024-10-13 11:54:51

设计模式——装饰者/策略/观察者模式的相关文章

《Head First 设计模式》学习笔记——观察者模式 + 装饰者模式

装饰者模式是JDK中另一个使用较多的设计模式,上一个是观察者模式(在Swing中大量使用),业内好的API设计无一离不开常见的设计模式,通常我们所说要阅读源码,也是为了学习大牛们的设计思路.----题记 设计模式 观察者模式:定义了对象之间一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新. 装饰者模式:动态地将责任附加到对象上.若要扩展功能,装饰者提供比继承者更有弹性的替代方案. 设计原则 (1)封装变化. (2)多用组合,少用继承. (3)针对接口编程,而不是

java设计模式------装饰着模式

java设计模式-------装饰者模式 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案.主要有组件(components)和装饰器(Decorator)组成.要求components和Decorator实现相同的接口或者抽象类(具体类的局限性太大). 设计原则.模式特点.适用性 - 1. 多用组合,少用继承. 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用

【笔记】设计模式——装饰者模式

实现一个类似QQavator功能的代码 1.原始实现 1 //存在的问题: 2 //1.wear*方法出现重复代码,可以重构:实质上为代码结构一致,输出内容相同,可以通过在定义一个基类,在基类中定义抽象的Wear*,在子类中重写: 3 //2.倘若需求中新增某种服饰,需要修改Person类代码,不符合开放--封闭原则: 4 //3.客户端中代码暴露了具体装饰细节,理想情况下只需要提供装饰顺序,装饰细节封装起来: 5 class Person 6 { 7 private string name;

设计模式进阶(一) 策略模式

摘自<Design Paterns_Elements of Reusable Object-Oriented Software> 上一系列偏重于入门,从本篇开启进阶系列,着重于设计模式的适用情景. 回顾入门系列 设计模式入门(一)  策略模式 1  Intent Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)参见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decora

Java软件设计模式------装饰设计模式

Java软件设计模式一共分为23种; 一般常用的有: 单例设计模式 装饰设计模式 工厂设计模式 装饰设计模式 定义:英文叫Decorator Pattern,又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 在生活中我们用程序员和项目经理的例子来比喻,项目经理是从程序员开始的,经过不断地积累工作经验.不断的学习新的知识,才有可能升职. 在装饰设计模式中项目经理就是程序员的增强. 程序猿: 写程序 项目

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

设计模式---装饰者模式(学习笔记)

首先看装饰者模式的定义:动态的将责任附加到对象上.若要扩展功 能,装饰者提供了比继承更有弹性的替代方案! 先看看<大话设计模式>给出的类图: 实际上,装饰者模式就是:把装饰者对象当成"包装者",换言之,把要装饰的对象作为参数传递到装饰对象里去,然后进行操作.(如果理解不对,希望给指正),下面看代码来理解这个类图: 这是装饰者和需要装饰的具体对象共同的接口: public abstract class Component { abstract void Operation()

设计模式 - 装饰者模式(Decorator Pattern) 详解

装饰者模式(Decorator Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 使用方法: 1. 首先创建组件(Component)父类, 所有类,具体组件(Concrete Component)和装饰者(Decorator)都属于这一类型, 可以进行扩展