`
miaodezhi
  • 浏览: 8966 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

浅谈装饰器模式

阅读更多
浅谈装饰器模式

序:
今天,为了满足我们项目组长的愿望,硬非要把一个简单的一个接口实现函数,扩展为装饰器模式进行处理。据说可以
在以后扩展的时候很有好处。于是乎,我今儿就大学了一把装饰器模式,下面我就谈谈自己的理解吧。

正文---开整:
装饰器模式,顾名思义就是给类或者接口进行装饰的模式。模式这玩意说白了就是把一些浅显易懂的东西,冠以很高深
的名词,让人摸不着头脑,有点类似于哲学。不过里面的思想不可否认还是很有道理的,不然估计也不会有那个神经病
吃多了去搞这玩意,从此让诸位欲成为编程高手的人必经的一个难关。

装饰器涉及四个名词
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,打完收工。
分享到:
评论
4 楼 ysen 2009-02-18  
这和代理模式有什么区别?
3 楼 miaodezhi 2009-01-18  
wendong007 写道

你们组长还真逗啊

呵呵,其实偶们组长对我帮助还是蛮大的,经验特别丰富,能力那可是我的偶像啊。
2 楼 wendong007 2009-01-16  
你们组长还真逗啊
1 楼 pangtao 2009-01-16  
受益匪浅,感谢lz的分享

相关推荐

    浅谈Java设计模式系列-装饰器模式

    主要介绍了Java设计模式系列-装饰器模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java设计模式 版本2

    设计模式之代理模式,请求的链式处理——职责链模式,请求发送者与接收者解耦——命令模式,自定义语言的实现——解释器模式,遍历聚合对象中的元素——迭代器模式,协调多个对象之间的交互——中介者模式,撤销功能...

    design-pattern-java.pdf

    自定义语言的实现——解释器模式(五) 自定义语言的实现——解释器模式(六) 迭代器模式-Iterator Pattern 遍历聚合对象中的元素——迭代器模式(一) 遍历聚合对象中的元素——迭代器模式(二) 遍历聚合对象中的...

    asp.net知识库

    也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动...

    Python-高频-面试-知识点

    装饰器解释下,基本要求是什么? 3 9.新式类和旧式类区别 3 10.__new__和__init__的区别 3 11.单例模式的几种实现方式的及优化? 3 12.作用域的类型有哪些? 5 13.深拷贝和浅拷贝的区别? 5 14.多线程和多进程的区别...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

    Python核心编程第二版(ok)

     11.3.6 函数(与方法)装饰器   11.4 传递函数   11.5 FormalcArguments   11.5.1 位置参数   11.5.2 默认参数   11.6 可变长度的参数   11.6.1 非关键字可变长参数(元组)   11.6.2 ...

    Python核心编程第二版

     11.3.6 *函数(与方法)装饰器   11.4 传递函数   11.5 Formal Arguments   11.5.1 位置参数   11.5.2 默认参数   11.6 可变长度的参数   11.6.1 非关键字可变长参数(元组)   11.6.2 ...

    Python核心编程(第二版).pdf (压缩包分2部分,第二部分)

     11.3.6 *函数(与方法)装饰器   11.4 传递函数   11.5 formal arguments   11.5.1 位置参数   11.5.2 默认参数   11.6 可变长度的参数   11.6.1 非关键字可变长参数(元组)   11.6.2 ...

    Python核心编程(第二版).pdf (压缩包分2部分,第一部分)

     11.3.6 *函数(与方法)装饰器   11.4 传递函数   11.5 formal arguments   11.5.1 位置参数   11.5.2 默认参数   11.6 可变长度的参数   11.6.1 非关键字可变长参数(元组)   11.6.2 ...

Global site tag (gtag.js) - Google Analytics