裝飾模式

裝飾器模式概述

裝飾器模式也稱爲包裝模式,適用於在不改變原有類的情況下,增強類對象的功能

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();
	}
}

最終輸出的結果:
    封裝數據爲指定格式
    執行記錄日誌操作
    正常操作

優點

將裝飾功能從原有類中抽離出來,能在不修改原有類的基礎上增強其功能,而每個具體裝飾器只需關心自己的功能。

才疏學淺,如文中有錯誤,感謝大家指出。

 

發佈了25 篇原創文章 · 獲贊 21 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章