package com.test.design.decorator;
public abstract class Component {
public abstract void operate();
}
package com.test.design.decorator;
public class BaseComponent extends Component {
@Override
public void operate() {
System.out.println("执行相关操作...");
}
}
package com.test.design.decorator;
//装饰类,可以是抽象类(其他装饰类可以继承该类)
public class Decorator extends Component {
private Component component;
public Decorator(Component component){
this.component = component;
}
@Override
public void operate() {
//can do something else
System.out.println("操作前可增加一些操作。。");
this.component.operate();
System.out.println("操作前后也可增加一些操作。。");
//can do something else
}
}
package com.test.design.decorator;
public class Client {
public static void main(String[] args) {
Component component = new BaseComponent();
Decorator decorator = new Decorator(component);
decorator.operate();
}
}
Component 是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象。在装饰模式中,必然有一个被提取出来最核心、最原始、最基本的接口或抽象类。
装饰模式是对继承的有力补充,你要知道继承可不是万能的,继承可以解决实际的问题,但是在项目中你要考虑诸如易维护、易扩展、易复用等,而且在一些情况下你要是用继承就会增加很多了类,而且灵活性非常的差,那当然维护也不容易了,也就是说装饰模式可以替代继承,解决我们类膨胀的问题,你要知道继承是静态的给类增加功能,而装饰模式则是动态的给增加功能。
装饰模式还有一个非常好的优点,扩展性非常好,在一个项目中,你会有非常多因素考虑不到,特别是业务的变更,时不时的冒出一个需求,特别是提出一个令项目大量延迟的需求时候,那种心情是…,真想骂娘!装饰模式可以给我们很好的帮助,通过装饰模式重新封装一个类,而不是通过继承来完成,简单点说,三个继承关系Father,Son,GrandSon 三个类,我要再Son 类上增强一些功能怎么办?我想你会坚决的顶回去!不允许,对了,为什么呢?你增强的功能是修改Son 类中的方法吗?增加方法吗 ?对GrandSon的影响哪?特别是GrandSon 有多个的情况,你怎么办?这个评估的工作量就是够你受的,所以这个是不允许的,那还是要解决问题的呀,怎么办?通过建立SonDecorator 类来修饰Son,等于说是创建了一个新的类,这个对原有程序没有变更,通过扩充很好的完成了这次变更。