DercoratorPattern裝飾者模式
阿新 • • 發佈:2020-08-25
裝飾者模式
1,定義
動態的給一個物件新增一些額外的職責。
裝飾者模式通常有4個角色,就增加功能來說,裝飾者模式比生成子類更加的靈活。
Component:抽象構件。通常是一個介面或者抽象類,定義最核心最原始的物件。
public interface AbstractComponent {
/**
* 抽象方法
*/
void operate();
}
ConcreteComponent:具體構件。抽象構件的實現,即被裝飾的物件。
public class Component implements AbstractComponent { @Override public void operate() { System.out.println("do something!"); } }
Decorator:抽象裝飾者角色。通常是一個抽象類,可設定一個被裝飾物件。
public abstract class Decorator implements AbstractComponent { /** 定義一個裝飾構件 **/ private AbstractComponent abstractComponent; /** * 通過建構函式設定被裝飾者 * @param abstractComponent */ public Decorator(AbstractComponent abstractComponent) { this.abstractComponent = abstractComponent; } /** * 委託被裝飾著執行 */ @Override public void operate() { this.abstractComponent.operate(); } }
ConcreteDecorator:具體裝飾者角色。實現對構件的功能職責的擴充套件。
public class DecoratorOne extends Decorator { /** * 通過建構函式設定被裝飾者 * * @param abstractComponent */ public DecoratorOne(AbstractComponent abstractComponent) { super(abstractComponent); } /** * 定義自己的裝飾方法 */ private void methodOne() { System.out.println("DecoratorOne.methodOne 裝飾"); } /** * 重寫被裝飾物件的方法 */ @Override public void operate() { this.methodOne(); super.operate(); } } public class DecoratorTwo extends Decorator { /** * 通過建構函式設定被裝飾者 * * @param abstractComponent */ public DecoratorTwo(AbstractComponent abstractComponent) { super(abstractComponent); } /** * 定義自己的裝飾方法 */ private void methodTwo() { System.out.println("DecoratorTwo.methodTwo 裝飾"); } /** * 重寫被裝飾物件的方法 */ @Override public void operate() { super.operate(); this.methodTwo(); } }
場景類
public class Client {
public static void main(String[] args) {
/** 定義被裝飾著 **/
AbstractComponent component = new Component();
/** 第一次裝飾 **/
component = new DecoratorOne(component);
/** 第二次裝飾 **/
component = new DecoratorTwo(component);
component.operate();
}
}
2.應用
2.1 優點
- 裝飾者及被裝飾者相互獨立,兩者解耦,提高系統的靈活性。
- 裝飾者模式是繼承關係的替代方案,且不論被裝飾多少層,返回的物件仍然是該被裝飾者。
- 裝飾者模式可以動態的擴充套件一個實現類的功能。
2.2 缺點
- 多層裝飾會增加實現類的複雜度,減少裝飾類的數量可以降低系統的複雜度。
2.3 使用場景
- 動態的為一個物件增加功能,且可以動態的撤銷。
- 為一批實現類改裝或加裝功能。