修饰模式是类继承的另外一种选择。类继承在编译时候增加行为,而装饰模式是在运行时增加行为。
通过使用修饰模式,可以在运行时扩充一个类的功能。原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。
维基百科介绍,异步这里:http://zh.wikipedia.org/wiki/%E4%BF%AE%E9%A5%B0%E6%A8%A1%E5%BC%8F
直接上代码:
package com.decorate;
public interface IDecorate {
public void sayHello();
}
package com.decorate;
public class DecorateImpl implements IDecorate {
@Override
public void sayHello() {
System.out.print("Hello");
}
}
package com.decorate;
public class Decorate implements IDecorate {
// 声明一个被装饰的对象
private IDecorate decorate;
// 被装饰对象从装饰器的构造函数中传进来(必须这样做)
public Decorate(IDecorate decorate) {
this.decorate = decorate;
}
@Override
public void sayHello() {
decorate.sayHello();
}
}
package com.decorate;
public class SimpleDecorate extends Decorate {
public SimpleDecorate(IDecorate decorate) {
super(decorate);
}
// 开装饰了哦。。。
@Override
public void sayHello() {
// 在原来的方法中加入了sayChina方法。
sayChina();
super.sayHello();
// 在原来的方法中加入了sayWorld方法。
sayWorld();
}
public void sayChina() {
System.out.print("China, ");
}
public void sayWorld() {
System.out.print(" World!\n");
}
}
package com.decorate;
public class 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();
useDecorate(decorate);
}
}