顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一接口,装饰对象持有被装饰对象的实例。有点类似对象适配器,不过这里不是适配,而是装饰。
1、UML
2、共同的接口Sourceable
/**
* 共同的接口
* @author suibibk.com
*/
public interface Sourceable {
public void method();
}
3、被装饰者Source
/**
* 被装饰着
* @author suibibk.com
*/
public class Source implements Sourceable{
@Override
public void method() {
System.out.println("吃饭");
}
}
4、装饰者Decorator
/**
* 装饰者
* @author suibibk.com
*/
public class Decorator implements Sourceable{
private Source source;
public Decorator(Source source) {
super();
this.source = source;
}
@Override
public void method() {
System.out.println("煮饭");
source.method();
System.out.println("收拾碗筷");
}
}
这里动态的为Source的method添加了一些操作。
5、测试类Test
/**
* 测试类
* @author suibibk.com
*/
public class Test {
public static void main(String[] args) {
new Decorator(new Source()).method();
}
}
运行会输出如下结果:
煮饭
吃饭
收拾碗筷
总结
装饰模式的应用场景:
需要扩展一个类的功能
动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
缺点:产生过多的相似对象,不易排错,IO就是用了装饰模式,不过太多了 好难记。超级好理解且有用的一个模式。