介紹
裝飾模式(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();
}
}