裝飾器模式概述
裝飾器模式也稱爲包裝模式,適用於在不改變原有類的情況下,增強類對象的功能
UML
結構
組件接口:定義組件應有的功能
具體組件:實現了組件接口,需要被裝飾的對象
裝飾器:抽象類,引用和實現組件接口,默認調用組件類的operation方法,也可在組件原有功能的基礎上進行增強
具體裝飾類:繼承自裝飾器抽象類,通過重寫組件類的operation方法,增強其功能並調用父類的operation方法
代碼
package com.hpp.decorator;
public interface Component {
public void operation();
}
package com.hpp.decorator;
// 具體的組件類
public class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("正常操作");
}
}
package com.hpp.decorator;
// 裝飾類, 繼承Component接口, 並聲明使用一個Component實例
public abstract class Decorator implements Component {
Component component;
public void setComponent(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
package com.hpp.decorator;
//繼承了裝飾類的 具體的裝飾器類A
public class ConcreteDecoratorA extends Decorator {
@Override
public void operation() {
// 裝飾的代碼
System.out.println("封裝數據爲指定格式");
// 執行完上面的裝飾邏輯後, 再調用傳入的原組件類方法
super.operation();
}
}
package com.hpp.decorator;
// 繼承了裝飾類的 具體的裝飾器類B
public class ConcreteDecoratorB extends Decorator {
@Override
public void operation() {
System.out.println("執行記錄日誌操作");
super.operation();
}
}
package com.hpp.decorator;
public class TestMain {
public static void main(String[] args) {
Component c = new ConcreteComponent();
Decorator decoratorA = new ConcreteDecoratorA();
Decorator decoratorB = new ConcreteDecoratorB();
// 對組件對象進行B裝飾
decoratorB.setComponent(c);
// 對已經裝飾上B的對象進行裝飾
decoratorA.setComponent(decoratorB);
// 執行最後的裝飾結果
decoratorA.operation();
}
}
最終輸出的結果:
封裝數據爲指定格式
執行記錄日誌操作
正常操作
優點
將裝飾功能從原有類中抽離出來,能在不修改原有類的基礎上增強其功能,而每個具體裝飾器只需關心自己的功能。
才疏學淺,如文中有錯誤,感謝大家指出。