打字猴:1.700477294e+09
1700477294 通过例子,我们可以看出代理模式和装饰模式有非常相似的地方,甚至代码实现都非常相似,特别是装饰模式中省略抽象装饰角色后,两者代码基本上相同,但是还是有细微的差别。
1700477295
1700477296 代理模式是把当前的行为或功能委托给其他对象执行,代理类负责接口限定:是否可以调用真实角色,以及是否对发送到真实角色的消息进行变形处理,它不对被主题角色(也就是被代理类)的功能做任何处理,保证原汁原味的调用。代理模式使用到极致开发就是AOP,这是各位采用Spring架构开发必然要使用到的技术,它就是使用了代理和反射的技术。
1700477297
1700477298 装饰模式是在要保证接口不变的情况下加强类的功能,它保证的是被修饰的对象功能比原始对象丰富(当然,也可以减弱),但不做准入条件判断和准入参数过滤,如是否可以执行类的功能,过滤输入参数是否合规等,这不是装饰模式关心的。
1700477299
1700477300 代理模式在Java的开发中俯拾皆是,是大家非常熟悉的模式,应用非常广泛,而装饰模式是一个比较拘谨的模式,在实际应用中接触比较少,但是也有不少框架项目使用了装饰模式,例如在JDK的java.io.*包中就大量使用装饰模式,类似如下的代码:
1700477301
1700477302 OutputStream out=new DataOutputStream(new FileOutputStream(“test.txt”))
1700477303
1700477304 这是装饰模式的一个典型应用,使用DataOutputStream封装了一个FileOutputStream,以方便进行输出流处理。
1700477305
1700477306
1700477307
1700477308
1700477309 设计模式之禅 [:1700454069]
1700477310 设计模式之禅 31.2 装饰模式VS适配器模式
1700477311
1700477312 装饰模式和适配器模式在通用类图上没有太多的相似点,差别比较大,但是它们的功能有相似的地方:都是包装作用,都是通过委托方式实现其功能。不同点是:装饰模式包装的是自己的兄弟类,隶属于同一个家族(相同接口或父类),适配器模式则修饰非血缘关系类,把一个非本家族的对象伪装成本家族的对象,注意是伪装,因此它的本质还是非相同接口的对象。
1700477313
1700477314 大家都应该听过丑小鸭的故事吧,我们今天就用这两种模式分别讲述丑小鸭的故事。话说鸭妈妈有5个孩子,其中4个孩子都是黄白相间的颜色,而最小的那只也就是叫做丑小鸭的那只,是纯白色的,与兄弟姐妹不相同,在遭受了诸多的嘲讽和讥笑后,最终丑小鸭变成了一只美丽的天鹅。那我们如何用两种不同模式来描述这一故事呢?
1700477315
1700477316 31.2.1 用装饰模式描述丑小鸭
1700477317
1700477318 用装饰模式来描述丑小鸭,首先就要肯定丑小鸭是一只天鹅,只是因为她小或者是鸭妈妈的无知才没有被认出是天鹅,经过一段时间后,它逐步变成一个漂亮、自信、优美的白天鹅。根据分析我们可以这样设计,先设计一个丑小鸭,然后根据时间先后来进行不同的美化处理,怎么美化呢?先长出漂亮的羽毛,然后逐步展现出异于鸭子的不同行为,如飞行,最终在具备了所有的行为后,它就成为一只纯粹的白天鹅了,那我们来看类图,如图31-3所示。
1700477319
1700477320
1700477321
1700477322
1700477323 图31-3 装饰模式实现丑小鸭
1700477324
1700477325 类图比较简单,非常标准的装饰模式。我们按照故事的情节发展一步一步地实现程序。初期的时候,丑小鸭表现得很另类,叫声不同,外形不同,致使周围的亲戚、朋友都对她鄙视,那我们来建立这个过程,由于丑小鸭的本质就是一个天鹅,那我们就先生成一个天鹅的接口,如代码清单31-7所示。
1700477326
1700477327 代码清单31-7 天鹅接口
1700477328
1700477329 public interface Swan{
1700477330
1700477331 //天鹅会飞
1700477332
1700477333 public void fly();
1700477334
1700477335 //天鹅会叫
1700477336
1700477337 public void cry();
1700477338
1700477339 //天鹅都有漂亮的外表
1700477340
1700477341 public void desAppaearance();
1700477342
1700477343 }
[ 上一页 ]  [ :1.700477294e+09 ]  [ 下一页 ]