一、定義
裝飾器模式是爲已有的模式動態地添加額外的功能的一種模式。允許向一個現有的對象添加新的功能,但是不影響其結構。作爲現有對象的一個包裝。這種模式創建了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
二、設計類圖
三、作用
一般的,我們爲了擴展一個類經常使用繼承方式實現,由於繼承爲類引入靜態特徵,並且隨着擴展功能的增多,子類會很膨脹。動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更爲靈活。
四、代碼實現
/**
* 基礎的接口
* @Author: [email protected]
* @Date: 2019-11-12 09:22
*/
public interface Apple {
void res();
}
/**
* 實現接口具體的類
*
* @Author: [email protected]
* @Date: 2019-11-12 09:23
*/
public class ConcreteApple implements Apple {
@Override
public void res() {
System.out.println("普通蘋果");
}
}
/**
* 裝飾器基類
*
* @Author: [email protected]
* @Date: 2019-11-12 09:24
*/
public abstract class Decorator implements Apple {
protected Apple apple;
public Decorator(Apple apple) {
this.apple = apple;
}
@Override
public void res() {
apple.res();
}
}
/**
* 具體的裝飾類的實現類
*
* @Author: [email protected]
* @Date: 2019-11-12 09:26
*/
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Apple apple) {
super(apple);
}
public void resA() {
System.out.println("被裝飾器A擴展的功能,我是紅色的蘋果.");
}
@Override
public void res() {
super.res();
//在重寫原有方法時 裝飾了一個resA方法
resA();
}
}
/**
* 具體的裝飾類的實現類
*
* @Author: [email protected]
* @Date: 2019-11-12 09:27
*/
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Apple apple) {
super(apple);
}
public void resB() {
System.out.println("被裝飾器B擴展的功能,我是綠色的蘋果.");
}
@Override
public void res() {
super.res();
resB();
}
}
/**
* 主類測試
*
* @Author: [email protected]
* @Date: 2019-11-12 09:28
*/
public class Main {
public static void main(String[] args) {
Apple apple = new ConcreteApple();
//原來的方法
apple.res();
//裝飾出紅色的蘋果
ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(apple);
decoratorA.res();
//裝飾後的方法 裝飾出綠色的蘋果
ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(apple);
decoratorB.res();
}
}
輸出結果:
普通蘋果
普通蘋果
被裝飾器A擴展的功能,我是紅色的蘋果.
普通蘋果
被裝飾器B擴展的功能,我是綠色的蘋果.