| potian |
回复:
设计模式学习心得之Decorator模式的Java例子(自己写的,有问题请各位指教)
从我的角度来看,你还没有完全理解decorator模式,问题就在第一句话(对应你的程序)
〉〉原文中的Decorator是一个interface,后跟几个子类。我这里只是用了一
〉〉个class,并没有做那个接口。
我可以说,这个interface是整个decorator的核心。
如果你使用的是一个具体的类,那么显然这个类就不能被Closed.你可能想我后面的decorator可以覆盖这个类的属性,那么这就是在reforctoing里面经常碰到的问题,需要把这个继承地类和原先的类进行旋转:
形如
|————————|
| A |
|________________|
|
|
|————————|
| A' |
|________________|
旋转成为
|———--------——---|
| superA(interface) |
|___________________ |
| |
| |
————————— —————————
| A | | A' |
————————-- ————————--
这里的接口所揭示的一个重要问题就是如果你对一个具体类覆盖并完全改变它的行为,那么liskov替换原则就可能发生问题(我准备在主页上文章上好好讲述这几个面向对象的原则,你可以直接到objectmentor.com去看一看),也就不能closed。当然,你不一定把它表现为interface,譬如包含component.
另外一个问题就更明显了,你在decorator的构建函数中使用了
w.operation();
这一点是不对的。
让decorator成为一个接口,
然后实现一个BaseDecorator,内部包含一个windows变量,
protected Window window;
public BaseDecorator(Window window) {
this.window = window;
}
public void operation(){
window.operation();
}
(这是一个JavaIdom,定义接口和缺省实现pair,如果你不同意,可以不实现这个BaseDecorator)
接下去继承一个实际的decorator,这个类里面的方法如下:
public void operation(){
window.operation();
addOpertaion();
}
如果按你的实现方式,如何去实现多个操作operation1,operation2,如何去包装多层的decorator,注意decorator在运行时刻形成的是一条对象链,你可以看erptao.org上role模式,在role的里面也讲到了decorator,第二种role处理方法将直接使用decorator(我还没有把文章第三部分上传,请稍候)
还有一个问题是你的最后一句应该写为
Window d = new Decorator(t);
而不是
Decorator d = new Decorator(t);
记住,要使用Window接口,而不是decorator,这是透明的含义所在,也是在所有的OO编程中要记住的原则。
|