浏览 7071 次
锁定老帖子 主题:浅谈装饰器模式
精华帖 (0) :: 良好帖 (1) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-15
序: 今天,为了满足我们项目组长的愿望,硬非要把一个简单的一个接口实现函数,扩展为装饰器模式进行处理。据说可以 在以后扩展的时候很有好处。于是乎,我今儿就大学了一把装饰器模式,下面我就谈谈自己的理解吧。 正文---开整: 装饰器模式,顾名思义就是给类或者接口进行装饰的模式。模式这玩意说白了就是把一些浅显易懂的东西,冠以很高深 的名词,让人摸不着头脑,有点类似于哲学。不过里面的思想不可否认还是很有道理的,不然估计也不会有那个神经病 吃多了去搞这玩意,从此让诸位欲成为编程高手的人必经的一个难关。 装饰器涉及四个名词 1、接口或者抽象基类 2、被装饰对象,也就是一个简单的实现了1中提到的接口或者抽象基类的实现类。 3、装饰对象,就是去装饰被装饰对象的对象 4、继承装饰对象类的子类,也就是具体的装饰器类了。 说了这么多,估计你基本跟没听说过一样。好了,来段代码,看看 //这是第一类名词 public interface IDecorate { public void sayHello(); } //这是第二类名词 public class DecorateImpl implements IDecorate { public void sayHello() { System.out.print("Hello"); } } //这是第三类名词,真正的装饰器就在这里开始了,也是所有欲实现装饰器的父类 public class Decorate implements IDecorate { //声明一个被装饰的对象 private IDecorate decorate; //被装饰对象从装饰器的构造函数中传进来(必须这样做) public Decorate(IDecorate decorate) { this.decorate = decorate; } //在基类装饰器中只调用被装饰对象的方法 public void sayHello() { decorate.sayHello(); } } 再对这个装饰器的基类说明一下,在每个装饰器模式中,这个类的结构基本不变 或者说这上面是装饰器第三类名词中最小的类了,必须有以上定义的这些元素。 //这是第四类名词,装饰就看这里了 public class SimpleDecorate extends Decorate { public Decorate(IDecorate decorate) { super(decorate); } //开装饰了哦。。。 public void sayHello() { //在原来的方法中加入了sayChina方法。 sayChina(); super.sayHello(); //在原来的方法中加入了sayWorld方法。 sayWorld(); } public void sayChina() { System.out.print("China, "); } public void sayWorld() { System.out.print(" World!\n"); } } //来,测试一下 public void TestDecorate() { //不使用装饰器 public static void unUseDecorate(IDecorate decorate) { //输出 Hello decorate.sayHello(); } //使用装饰器 public static void useDecorate(IDecorate decorate) { IDecorate simpleDecorate = new SimpleDecorate(decorate); //要调用装饰了的方法 //输出 China, Hello World! simpleDecorate.sayHello(); } public static void main(String[] argv) { IDecorate decorate = new DecorateImpl(); } } //是不是发现,原来只输出的hello的方法被装饰后,在其前和其后分别输出了china和world啦。 看到装饰器的威力了吧,把原来不变的方法改变了。那我们就来谈谈他的使用场景吧: 1、装饰器模式主要装饰供外部调用的接口方法,如果一个接口方法只是提供给内部调用,则不能使用该模式。 2、装饰器模式主要装饰可能要改变的接口方法,如果类中的某种行为在将来可能发生变化,而你又懒得去改变 原来的类,那么就可以考虑使用装饰器模式了。 注意:模式只是解决问题的一种途径,没有必要非得在某块使用模式,所以装饰器模式这种东西,切勿刻意为之。 见识肤浅,望各位指教。 OK,打完收工。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-01-16
受益匪浅,感谢lz的分享
|
|
返回顶楼 | |
发表时间:2009-01-16
你们组长还真逗啊
|
|
返回顶楼 | |
发表时间:2009-01-18
wendong007 写道 你们组长还真逗啊 呵呵,其实偶们组长对我帮助还是蛮大的,经验特别丰富,能力那可是我的偶像啊。 |
|
返回顶楼 | |
发表时间:2009-02-18
这和代理模式有什么区别?
|
|
返回顶楼 | |