作者 内容
 smilingleo  设计模式学习心得之Decorator模式的Java例子(自己写的,有问题请各位指教)

由于原文是用C++写的,转到java就有些问题,我用java写了个小例子
,不知对否。
原文中的Decorator是一个interface,后跟几个子类。我这里只是用了一个class,并没有做那个接口。
interface Window
{
public void operation();
}
class TextViewer implements Window{
TextViewer(){
System.out.println("I'm a TextViewer!");
}
public void operation(){
System.out.println("TextViewer's operation.");
}
}
class Decorator implements Window{
Decorator(Window w){
w.operation();
System.out.println("I'm a Decorator!");
}
public void operation(){
System.out.print("Decorator's operation and ");
this.addedOperation();
}
public static void addedOperation(){
System.out.println("added operation!");
}
}
public class Test{
public static void main(String args[]){
TextViewer t = new TextViewer();

Decorator d = new Decorator(t);
d.operation();
}
}
 01/09/05 08:32 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 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编程中要记住的原则。
 01/09/05 11:00 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 smilingleo   回复: 设计模式学习心得之Decorator模式的Java例子(自己写的,有问题请各位指教)

首先,万分感谢potian大虾的指点。希望以后还能不惜赐教。

我知道Decorator的精髓就是在那个Decorator接口中,下面可以扩展许多的修饰类。我之所以没有设计这个接口,纯粹是出于简单化。不想太复杂,所以就只设计了Decorator类一个修饰类,是不是可以这么说:“这是Decorator模式的最简形式。”

另外,我以前却是对透明调用没有太深的理解,经大虾点拨,心中顿悟。谢谢!
我将修改后的代码附于后面,请大虾指正。
interface Window
{
public void operation();
}
class TextViewer implements Window{
TextViewer(){
System.out.println("I'm a TextViewer!");
}
public void operation(){
System.out.println("TextViewer's operation.");
}
}
interface Decorator extends Window{
public void operation();
}
class ConcreteDecorator implements Decorator{
Window win = null;
ConcreteDecorator(Window w){
this.win = w;
}
public void operation(){
System.out.println("ConcreteDecorator's operation");
this.addedOperation();
}
public static void addedOperation(){
System.out.println("added operation!");
}
}
public class Test{
public static void main(String args[]){
TextViewer t = new TextViewer();

Window d = new ConcreteDecorator(t);
d.operation();
}
}
 01/09/06 09:05 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首