定义
装饰模式(Decorator Pattern)
定义:动态的给一个对象添加一些额外的职责,就增加功能而言,装饰模式相比生成子类更加灵活
Component抽象类:Component是一个接口或是抽象类,用于定义我们最核心的对象
注意:在装饰模式中,必须有一个最基本,最核心,最原始的接口或抽象类充当Component抽象类
ConcreteComponent具体类:是上边Component的实现类,我们所需要装饰的就是它
Decorator装饰类:一般是一个抽象类,去实现接口或抽象方法,在其属性中必须有一个private变量指向Component抽象类
ConcreteDecorator具体装饰类:把最核心/最原始/最基本的东西装饰为其他东西
通用源码
//Component抽象类
public abstract class Component{
//抽象方法
public abstract void operate();
}
//ConcreteComponent具体类
public class ConcreteComponent extends Component{
//具体实现
@Override
public void operate(){
System.out.println("do Something");
}
}
//Decorator装饰类
public abstract class Decorator extends Component{
private Component component = null;
//通过构造函数传递被修饰者
public Decorator(Component _component){
this.component = _component;
}
//委托给被修饰者执行
@Override
public void operate(){
this.component.operate();
}
}
//ConcreteDecorator具体装饰类
//若只有一个装饰类,则可以没有抽象装饰类,直接实现具体装饰类即可
//注意:原始方法和修饰方法的执行顺序在具体装饰类是固定的,可以通过重载实现多种执行顺序
public class ConcreteDecorator1 extends Decorator{
//定义被修饰者
public ConcreteDecorator1(Component _component){
super(_component);
}
//定义自己的修饰方法
private void method1(){
System.out.println("修饰方法1“);
}
//重写父类的Operate方法
public void operate(){
this.method1();
super.operate();
}
}
public class ConcreteDecorator2 extends Decorator{
//定义被修饰者
public ConcreteDecorator2(Component _component){
super(_component);
}
//定义自己的修饰方法
private void method2(){
System.out.println("修饰方法2“);
}
//重写父类的Operate方法
public void operate(){
this.method1();
super.operate();
}
}
//场景类
public class Client{
public static void main(String[] args){
Component component = new ConcreteComponent();
//第一次修饰
component = new ConcreteDecorator1(component);
//第二次修饰
component = new ConcreteDecorator2(component);
//修饰后运行
component.operate();
}
}
应用
优点
- 装饰类和被装饰类可以独立发展,而不互相之间耦合:就是Component类无需直到Decorator类,Decorator类是从外部来扩展Component类的功能,而Decorator类也无需知道具体的构件
- 装饰模式是继承关系的一个代替方案
- 装饰模式可以动态的扩展实现类的功能
缺点
多层的装饰会使得系统变得复杂;因此需要我们尽量减少装饰类的数量,以便降低系统的复杂度
使用场景
- 需要扩展一个类的功能,或是增加附加功能
- 需要动态给一个对象增加功能,这些功能还可以动态的撤销
- 需要为一个兄弟类进行改造或增加功能
注意:装饰模式是对继承的有力补充;装饰模式可以代替继承,解决我们类过于膨胀的问题;继承是静态的给类增加功能,而装饰模式是动态的增加功能