2008-05-04
Decorator模式
最近遇到一个需求,是要对一个类增加一些新的功能,原则上讲是不改变这个类的代码,不改变这个类的继承关系。以前了解过Decorator模式,所以特意又深入学习一会。
什么时候需要Decorator模式:它的主要功能是不改变类的代码和继承关系,为这个类增加功能。
例如我要计划做一件事情(例如 打印某段文字)
可是由于工作变化,我需要在DoWork之前做另外一件事(打印一段特殊文字),并且在做完DoWork以后还要做一些简单的处理(同样是打印文字)。如何在不改变原有的继承关系的前提下实现此功能?
首先我们观察,所有的工作都是围绕做某件事情,所以我们可以抽象出一个接口。
所以原有的类可以更改为
我们可以考虑按照要求,我们所要添加的两个动作也是围绕的doWork()来做文章,只是具体的实现办法有些变换,我们可以不可以另外添加一个辅助的类 OtherWork,通过他来实现要求中的两个功能,并且调用原来计划要执行的工作。
我们测试一下,这个DoAllWork是不是能完成我们的需要
OK,运行一下,一切都以实现 :) 这种通过简单的一个实现类,帮助我们达到了要求,这种模式就是Decorator模式。
什么时候需要Decorator模式:它的主要功能是不改变类的代码和继承关系,为这个类增加功能。
例如我要计划做一件事情(例如 打印某段文字)
public class DoWork(){
public void doWork(){
System.out.prinln("Do Work.....");
}
}
]
可是由于工作变化,我需要在DoWork之前做另外一件事(打印一段特殊文字),并且在做完DoWork以后还要做一些简单的处理(同样是打印文字)。如何在不改变原有的继承关系的前提下实现此功能?
首先我们观察,所有的工作都是围绕做某件事情,所以我们可以抽象出一个接口。
public interface Work(){
public void doWork();
}
所以原有的类可以更改为
public class DoWork implements Work(){
public void doWork(){
System.out.println("Do Work....");
}
}
我们可以考虑按照要求,我们所要添加的两个动作也是围绕的doWork()来做文章,只是具体的实现办法有些变换,我们可以不可以另外添加一个辅助的类 OtherWork,通过他来实现要求中的两个功能,并且调用原来计划要执行的工作。
public class DoAllWork implements Work(){
private Work work;
//为调用原来计划需要执行的任务做准备
public DoAllWork(Work work){
this.work = work;
}
public void beforeWork(){
System.out.println("Before Work....");
}
public void endWork(){
System.out.println("End Work....");
}
public void doWork(){
beforeWork();
work.doWork();
endWork();
}
}
我们测试一下,这个DoAllWork是不是能完成我们的需要
public class Main(){
public static void main(String[] args){
Work work = new DoWork();
DoAllWork daw = new DoAllWork(work);
daw.doWork;
}
}
OK,运行一下,一切都以实现 :) 这种通过简单的一个实现类,帮助我们达到了要求,这种模式就是Decorator模式。
评论
bloodrate
2008-06-11
还是要修改啊,原来得dowork不实现接口啊
xql80329
2008-06-03
希望以后发的时候能够注意一下错误
weili788
2008-06-03
jbon 写道
看上去更像代理模式
赞同!!
yupch
2008-06-03
jbon 写道
看上去更像代理模式
看上去很象静态代理.哈哈...
jbon
2008-05-19
看上去更像代理模式
风雪涟漪
2008-05-05
不错。受益了。呵呵 接口带来的好处是显而易见了。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 6392 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
Adapter模式(Class Adap ...
我觉得不如改成这样: public class Put implements ...
-- by bloodrate -
Decorator模式
还是要修改啊,原来得dowork不实现接口啊
-- by bloodrate -
Adapter模式(Class Adap ...
putBall(); 哪儿呢?
-- by xql80329 -
Decorator模式
希望以后发的时候能够注意一下错误
-- by xql80329 -
Decorator模式
jbon 写道看上去更像代理模式 赞同!!
-- by weili788






评论排行榜