装饰器模式,顾名思义就是给类或者接口进行装饰的模式。模式这玩意说白了就是把一些浅显易懂的东西,冠以很高深
的名词,让人摸不着头脑,有点类似于哲学。不过里面的思想不可否认还是很有道理的,不然估计也不会有那个神经病
1、接口或者抽象基类
2、被装饰对象,也就是一个简单的实现了1中提到的接口或者抽象基类的实现类。
3、装饰对象,就是去装饰被装饰对象的对象
4、继承装饰对象类的子类,也就是具体的装饰器类了。
再对这个装饰器的基类说明一下,在每个装饰器模式中,这个类的结构基本不变
或者说这上面是装饰器第三类名词中最小的类了,必须有以上定义的这些元素。
//是不是发现,原来只输出的hello的方法被装饰后,在其前和其后分别输出了china和world啦。
看到装饰器的威力了吧,把原来不变的方法改变了。那我们就来谈谈他的使用场景吧:
1、装饰器模式主要装饰供外部调用的接口方法,如果一个接口方法只是提供给内部调用,则不能使用该模式。
2、装饰器模式主要装饰可能要改变的接口方法,如果类中的某种行为在将来可能发生变化,而你又懒得去改变
原来的类,那么就可以考虑使用装饰器模式了。
注意:模式只是解决问题的一种途径,没有必要非得在某块使用模式,所以装饰器模式这种东西,切勿刻意为之。
见识肤浅,望各位指教。
OK,打完收工。
的名词,让人摸不着头脑,有点类似于哲学。不过里面的思想不可否认还是很有道理的,不然估计也不会有那个神经病
吃多了去搞这玩意,从此让诸位欲成为编程高手的人必经的一个难关。
装饰器模式有什么用处呢?
下面解释装饰器模式是如何引起的,深入浅出模式设计的例子很好,就是喝咖啡,有个调料的类,你可以加糖、冰、牛奶等等好多原料,那么生成调配方案时,可以通过继承来实现,但是大家也都知道排列组合,继承的类系统庞大可想而知了。
这就诞生了装饰器模式,他的原则是,保持原有的接口,并为原来的动态的添加新的功能。
下面是维基百科的解释:相信大家都可以看懂
“通过使用修饰模式,可以在运行时扩充一个类的功能。原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。
装饰器涉及四个名词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,打完收工。