目錄
- 一、背景介紹
- 二、思路&方案
- 三、過程
- 1.裝飾模式簡介
- 2.裝飾模式的類圖
- 3.裝飾模式代碼
- 4.裝飾模式,職責父類拆分的奧義
- 5.裝飾模式,部件抽象類的無中生有
- 四、總結
- 五、升華
一、背景介紹
最近公司在做架構模型的時候,涉及到裝飾模式的研究,對于裝飾模式的邊界理解,本次有了看山還是山的效果,故做此總結以記錄本次的升華。
二、思路&方案
- 1.裝飾模式簡介
- 2.裝飾模式的類圖
- 3.裝飾模式代碼
- 4.裝飾模式,職責父類拆分的奧義
- 5.裝飾模式,部件抽象類的無中生有
三、過程
1.裝飾模式簡介
裝飾模式(Decorator):動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
解釋:給(ConcreteComponent)對象增加一些額外(Decorator的子類)職責;就給(ConcreteComponent)增加功能來說;通過生成(ConcreteComponent)子類的方式增加功能;裝飾模式更為靈活(擴展裝飾子類通過聚合方式裝飾,耦合性更低)
2.裝飾模式的類圖
3.裝飾模式代碼
package com.a7DesignPattern.a2StructuralType.a04Decorator;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 14:43*/
public class Client {public static void main(String[] args) {ConcreteComponent c = new ConcreteComponent();ConcreteComponentA a = new ConcreteComponentA();ConcreteComponentB b = new ConcreteComponentB();a.setComponent(c);b.setComponent(a);b.Operation();}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 11:30*/
public abstract class Component {public abstract void Operation();
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 11:37*/
public class ConcreteComponent extends Component{@Overridepublic void Operation() {System.out.println("具體對象的操作");}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 11:43*/
public class Decorator extends Component{protected Component component;@Overridepublic void Operation() {if(component != null){component.Operation();}}public void setComponent(Component component) {this.component = component;}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 14:27*/
public class ConcreteComponentA extends Decorator{private String addedState;@Overridepublic void Operation() {super.Operation();addedState = "New State";System.out.println("具體裝飾對象A");}
}
package com.a7DesignPattern.a2StructuralType.a04Decorator;import com.a6UMLRelationShip.a3combination.a2.A;/*** 功能描述:** @Author:makang* @Date: 2021/5/19 14:29*/
public class ConcreteComponentB extends Decorator{@Overridepublic void Operation() {super.Operation();AddedBehavior();System.out.println("具體裝飾對象B");}private void AddedBehavior(){}
}
4.裝飾模式,職責父類拆分的奧義
Decorator類是從ConcreteComponent中的裝飾行為中抽象出來的類;從而使得后續擴展裝飾符合開閉原則。
5.裝飾模式,部件抽象類的無中生有
ConcreteComponent中的裝飾行為的拆分,使得這些行為與被裝飾者必須得從客戶端產生關系;這也就對客戶端暴露了業務;因而產生Component類。
四、總結
- 1.無裝飾模式情況下,將裝飾方式當做被裝飾者類中行為;這些行為對于被裝飾者類而言不支持開閉原則。
- 2.裝飾行為在被裝飾者中剝離之后,使得兩個如何合并成為了眼前的問題。
- 3.無中生有的做一個部件抽象類,又將兩者做了部件類上的合并。
- 4.技術上可以實現,業務上沒有實現;這樣的一種實現結果是否算是符合要求的? 將這條透明化的問題提出來也是進步的印證。
五、升華
該模式從技術角度通過剝離+無中生有父類的角度實現了擴展裝飾符合開閉原則,并且對于客戶端也沒有對外暴露裝飾過程的效果;在業務的角度是需要站到技術的基礎之上去理解業務才會更加順暢。