大话设计模式—装饰模式
裝飾模式(Decorator Pattern)允許向一個現(xiàn)有的對象添加新的功能,同時又不改變其結(jié)構(gòu)。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個包裝。
這種模式創(chuàng)建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
大話設(shè)計模式中程杰老師給出的定義,裝飾模式:動態(tài)地給一個對象添加一些額外的職責(zé),就增加功能來說,裝飾模式比生成子類更加靈活。
裝飾模式結(jié)構(gòu)圖如下:
關(guān)鍵代碼:
1、Component 類充當(dāng)抽象角色,不應(yīng)該具體實現(xiàn)。
2、修飾類引用和繼承 Component 類,具體擴(kuò)展類重寫父類方法。
我們通過下面的實例來演示裝飾模式的用法。其中,我們將把一個形狀裝飾上不同的顏色,同時又不改變形狀類。
類圖如下:
//抽象Shape接口,可以給這些對象添加職責(zé) package com.dfcDemo;public interface Shape {public abstract void draw(); } //具體形狀對象,可以給這些對象添加職責(zé) package com.dfcDemo;public class Circle implements Shape{@Overridepublic void draw() {System.out.println("shape:circle.");}} //具體形狀對象,可以給這些對象添加職責(zé) package com.dfcDemo;public class Rectangle implements Shape{@Overridepublic void draw() {System.out.println("shape:rectangle.");}} package com.dfcDemo; /*** Shape接口的抽象裝飾類* @author lmb**/ public abstract class ShapeDecorator implements Shape{public Shape decoratedShape;//ShapeDecorator類中要向構(gòu)造方法傳入一個被裝飾的對象public ShapeDecorator(Shape decoratedShape){this.decoratedShape = decoratedShape;}@Overridepublic void draw() {decoratedShape.draw(); }} //Shape接口的具體裝飾類,繼承自抽象裝飾類SHapeDecorator package com.dfcDemo;public class RedShapeDecorator extends ShapeDecorator{public RedShapeDecorator decoratedShape;//構(gòu)造方法傳入一個被裝飾的Shape對象public RedShapeDecorator(Shape decoratedShape) {super(decoratedShape);}@Overridepublic void draw() {decoratedShape.draw();//畫出一個圖形 setRedBorder(decoratedShape);//為這個圖形加一個紅色的邊框}//Shape接口抽象裝飾類的子類RedShapeDecorator特有的一個裝飾Shape實現(xiàn)類的裝飾方法private void setRedBorder(Shape decoratedShape){System.out.println("Border Color: Red");}} //測試類 package com.dfcDemo;public class TestDecorator {public static void main(String[] args) {Shape circle = new Circle();Shape redCircle = new RedShapeDecorator(new Circle());Shape redRectangle = new RedShapeDecorator(new Rectangle());System.out.println("Circle with normal border");circle.draw();//1、畫圖形 System.out.println("\nCircle of red border");redCircle.draw();//1、畫圖形 2、加紅色邊框System.out.println("\nRectangle of red border");redRectangle.draw();//1、畫圖形 2、加紅色邊框}}運行結(jié)果:
Circle with normal border shape:circle.Circle of red border shape:circle. Border Color: RedRectangle of red border shape:rectangle. Border Color: Red在該實例中裝飾模式是利用setBorder()來對對象進(jìn)行包裝。這樣每個裝飾對象的實現(xiàn)就和如何使用這個對象分離開了,每個裝飾對象只關(guān)心自己的功能,不需要關(guān)心如何被添加到對象鏈中。
裝飾模式是為已有的功能動態(tài)地添加更多功能的一種方式。但到底我們什么時候能用到呢?
當(dāng)系統(tǒng)需要新功能的時候,是向舊的類中添加新的代碼。這些新加的代碼通常裝飾了原有類的核心職責(zé)和行為,比如用紅色邊框裝飾Circle和Rectangle,但這種做大的問題在于,他們在主類中加入了新的字段、新的方法和新的邏輯,從而增加了主類的復(fù)雜度,就像起初的那個Shape類,而這些新加入的東西僅僅是對了滿足一些只在某種特定情況下才會執(zhí)行的特殊行為的需要。而裝飾模式卻提供了一個非常好的解決方案,它把每個要裝飾的功能放在單獨的類中,并讓這個類包裝它所要的對象,因此,當(dāng)需要執(zhí)行特殊行為時,客戶端代碼就可以在運行時根據(jù)需要有選擇的、按順序的使用裝飾功能包裝對象。
這樣我們可以總結(jié)出:
裝飾模式的優(yōu)點:把類中的裝飾功能從類中去掉,這樣可以簡化原有的類,這樣就能有效的把類的核心職責(zé)和裝飾功能區(qū)分開了,而且可以去除相關(guān)類中重復(fù)的裝飾邏輯;簡而言之,裝飾類和被裝飾類可以獨立發(fā)展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態(tài)擴(kuò)展一個實現(xiàn)類的功能。
裝飾模式的缺點:多層裝飾比較復(fù)雜。
使用場景: 1、擴(kuò)展一個類的功能。 2、動態(tài)增加功能,動態(tài)撤銷。
注意事項:可代替繼承
總結(jié)
以上是生活随笔為你收集整理的大话设计模式—装饰模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS判断当前的浏览器类型
- 下一篇: 大话设计模式—模板方法模式