快速业务通道

Decorator模式中遭遇继承与聚合的冲突 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
unter with class LowerLimit!"); counter.decrement(); } } /*public void increment() { counter.increment(); } public int read_value() { return counter.read_value(); }*/ } class CounterFactory { public static Counter createCounter(int value,int op) { switch(op) { case 1: { return new Counter(value); } case 2: { return new UpperLimit(new Counter(value)); } case 3: { return new LowerLimit(new Counter(value)); } default: { return new UpperLimit(new LowerLimit(new Counter(value))); } } } } class Console { private static BufferedReader read=new BufferedReader(new InputStreamReader(System.in)); public static int readInt(String index){ System.out.println(index); try{ return Integer.parseInt(read.readLine()); } catch(Exception e){ return 0; } } } public class Q1s{ public static void main(String[] args){ System.out.println("Counter Type:"); System.out.println("1: Normal"); System.out.println("2: Upper Limit"); System.out.println("3: Lower Limit"); System.out.println("4: Upper & Lower Limit"); int option=Console.readInt("Enter Choice:"); Counter c = CounterFactory.createCounter(6,option); int choice=1; while(choice!=4){ System.out.println("1: Increment"); System.out.println("2: Decrement"); System.out.println("3: Read Value"); System.out.println("4: Exit"); choice=Console.readInt("Enter Choice:"); switch(choice){ case 1: c.increment(); break; case 2: c.decrement(); break; case 3: int v=c.read_value(); System.out.println("Value="+v);break; } } } }

Decorator模式中遭遇继承与聚合的冲突(3)

时间:2010-12-23

按如下步骤运行出现明显问题:

1:选3,"Lower Limit",

2:选3,"Read Value" 获得的值是 6

3:选1,"Increment"(此后value值应为 7)

4:选3,"Read Value" 获得的值是 7(正确)

5:选2,"Decrement"(此后的value值应为 6)

6:选3,"Read Value" 获得的值为 7 (问题出现了)

考察 Upper Limit 时同样出现该问题

三:追究

从输出的追踪语句可以看出在class LowerLimit的decrement方法的开始两输出语句具有明显的指导意义而其中一方法是调用的来自父类的read_value()而另一个为聚合对象的read_value()。在上面步骤的第六步两句分别输出

Class value :7

Dec value :6

可见,有两份value的存在。问题是两份如何产生?

继续观察,工厂在开关语句选中case 3时调用的是

return new LowerLimit(new Counter(value));

其中新建一匿名对象为参数,继续追踪该过程,发现在class Decorator 中该匿名对象被Decorator的属性指向,而在指向之前,Decorator还把该匿名对象传给其父类,而父类取得该对象后仅仅是取出该对象中value的拷贝,由此有两份value存在:

1.在Decorator自身中(父类的value)

2.也在Decorator自身中(成员变量Counter的value属性)!

问题渐渐明朗,再次观察class LowerLimit,它仅仅实现了decrement()方法,也就是说,对LowerLimit调用read_value()与increment()时,其全部追溯到其父类中执行,而被作用的值value为第一类型值。对LowerLimit调用decrement()方法时,该方法是用其成员变量Counter的read_value()来执行的。此时被作用的值为第二类型值.所以会出现valu

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号