裝飾模式(結(jié)構(gòu)型模式) 裝飾模式(Decorator),動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來說,裝飾模式比生成子類更為靈活。[DP]
自己的理解:在不對(duì)原有類進(jìn)行修改的情況下動(dòng)態(tài)的對(duì)它進(jìn)行擴(kuò)展一些功能
優(yōu)點(diǎn):
缺點(diǎn):
Component:裝飾對(duì)象和被裝飾對(duì)象的共同父類 ConcreteComponent:被裝飾類,也為具體實(shí)現(xiàn)類 Decorator:裝飾類,自裝飾類的父類 ConcreteDecoratorA:子裝飾類,提供特定的裝飾 ConcreteDecoratorB:子裝飾類,提供特定的裝飾 更多的ConcreteDecorator(C,D,E,F)
例子:武裝機(jī)甲,一臺(tái)機(jī)甲,沒有任何裝備,現(xiàn)在需要給機(jī)甲裝上各種裝備,機(jī)甲是被裝飾對(duì)象,給機(jī)甲新增裝備為裝飾類,動(dòng)態(tài)的添加武器裝備和防具裝備 被裝飾對(duì)象與裝飾對(duì)象的共同父類 /** * @ Author :fonxi * @ Date :2019/5/13 3:02 * @ Description:裝飾對(duì)象和被裝飾對(duì)象的共同父類 */ public interface Component { void operation(); } 被裝飾對(duì)象,擁有完整的操作 /** * @ Author :fonxi * @ Date :2019/5/13 3:06 * @ Description:被裝飾者對(duì)象 機(jī)甲類 */ public class ConcreteComponent implements Component{ @Override public void operation() { System.out.println("末日機(jī)甲前來報(bào)道,裝備:"); } } 裝飾類,持有一個(gè)被裝飾對(duì)象的引用,并且在被調(diào)用時(shí),調(diào)用被裝飾對(duì)象的方法 /** * @ Author :fonxi * @ Date :2019/5/13 3:09 * @ Description:裝飾類 */ public abstract class Decorator implements Component { //持有一個(gè)被裝飾對(duì)象的引用 private Component component; public void setComponent(Component component) { this.component = component; } @Override public void operation() { if(component != null){ component.operation(); } } } 子裝飾類,在調(diào)用提供特定的裝飾操作時(shí),調(diào)用父類方法 /** * @ Author :fonxi * @ Date :2019/5/13 3:18 * @ Description:具體裝飾類 機(jī)甲裝備武器改裝類 */ public class ConcreteDecoratorA extends Decorator{ @Override public void operation() { super.operation(); System.out.println("改裝:等離子高頻激光劍"); } } 同上 /** * @ Author :fonxi * @ Date :2019/5/13 3:28 * @ Description:具體裝飾類 機(jī)甲裝備防具改裝類 */ public class ConcreteDecoratorB extends Decorator{ @Override public void operation() { super.operation(); System.out.println("改裝:全適應(yīng)立場(chǎng)防護(hù)盾"); } } 客戶端調(diào)用類 /** * @ Author :fonxi * @ Date :2019/5/13 3:00 * @ Description:客戶端調(diào)用類 */ public class TestController { public void print(){ ConcreteComponent concreteComponent = new ConcreteComponent(); ConcreteDecoratorA cA = new ConcreteDecoratorA(); ConcreteDecoratorB cB = new ConcreteDecoratorB(); cA.setComponent(concreteComponent); cB.setComponent(cA); cB.operation(); } }
輸出結(jié)果: 末日機(jī)甲前來報(bào)到,裝備: 改裝:等離子高頻激光劍 改裝:全適應(yīng)立場(chǎng)防護(hù)盾
裝飾模式能動(dòng)態(tài)的擴(kuò)展一個(gè)類,并且不修改原來的類,能夠靈活的增刪,比繼承要好。(感覺作用和代理模式有點(diǎn)象^_^) |
|