介绍
装饰模式(Decorator Pattern)也称为包装模式,动态的给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
优缺点
优点
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点
多层装饰比较复杂
使用场景
1.扩展一个类的功能。 2.动态增加功能,动态撤销。
举例
该模式包含角色
抽象组件类
/**
* 抽象组件类
*/
public abstract class Component {
/**
* 抽象方法
*/
public abstract void operate();
}
组件具体实现类
/**
* 组件具体实现类
*/
public class ConcreteComponent extends Component{
@Override
public void operate() {
// 具体逻辑
System.out.println("组件具体实现类operate");
}
}
抽象装饰者类
/**
* 抽象装饰者类
*/
public abstract class Decorator extends Component{
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void operate() {
System.out.println("抽象装饰者operate");
component.operate();
}
}
装饰者具体实现类
/**
* 装饰者具体实现类
*/
public class ConcreteDecoratorA extends Decorator{
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operate() {
super.operate();
System.out.println("装饰者具体实现类operate");
operateA();
}
/**
* 自定义装饰方法A
*/
private void operateA(){
System.out.println("自定义装饰方法operateA");
}
}
客户端调用类
/**
* 客户端调用类
*/
public class Client {
public static void main(String[] args) {
// 构造组件对象
Component component = new ConcreteComponent();
// 构造装饰者对象并调用,此时相当于给组件对象增加装饰者A的功能方法
Decorator decorator = new ConcreteDecoratorA(component);
decorator.operate();
}
}