设计模式:(装饰模式)
1.定義
裝飾模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。
這種模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
簡單來說:裝飾模式式動態地擴展一個對象的功能,而不需要改變原始類代碼的一種成熟模式。
2.概述
在許多設計中,可能需要改進類的某個對象的功能,而不是該類創建的全部對象。 例如,鳥類的實例(麻雀)能連續飛行100米,如果用鳥類創建了5只麻雀對象,那么這5只麻雀都能連續飛行100米。假設我們想讓其中一只麻雀能夠連續飛行150米(大于100),那么應當怎么做呢?我們不想通過修改麻雀類的代碼使得麻雀類創建的麻雀都能連續飛行150米,這也不符合我們的初衷:改進類的某個對象的功能。
一種比較好的方式就是給某只麻雀裝上只能電子翅膀。智能電子翅膀可以死的麻雀不適用自己的翅膀就能飛行50米。那么一只安裝了這種智能電子翅膀的麻雀就能飛行150了,因為麻雀首先使用自己的翅膀飛行100米,然后在使用智能電子翅膀飛行50米,一共150米。
3.應用場景
1、擴展一個類的功能。
2、動態增加功能,動態撤銷。
4.模式的結構和使用
裝飾模式的結構中包括四種角色:
1.抽象組件(Component):抽象組件是一個抽象類。抽象組件定義了“被裝飾者”需要進行“裝飾”的方法;
2.具體組件(ConcreteComponent):具體組件是抽象組件的一個子類,具體組件的實例稱之為“被裝飾者”;
3.裝飾(Decorator):裝飾也是抽象組件的一個子類,但但裝飾還包含一個抽象組件聲明的變量以保存“被裝飾者”的引用。裝飾可以是抽象類也可以是一個非抽象類,如果是非抽象類,那么該類的實例就是“裝飾者”;
4.具體裝飾(ConcreteDecorator):具體裝飾是裝飾的一個非抽象子類,具體裝飾的實例稱作裝飾者。
1.裝飾模式的UML類圖
前面概述所提到的麻雀就是類圖中的ConcreteComponent角色的實例,安裝了一對智能電子翅膀的麻雀是ConcreteDecorator角色的實例。
2.結構的描述
假設系統中有一個Bird抽象類以及Bird類的一個子類:Sparrow。Sparrow類實現了Bird類的fly方法,使得Sparrow類創建的對象(麻雀)調用fly方法能連續飛行100米;
現在,用戶需要兩只鳥,無論那只鳥都可以,但必須分別能夠連續飛行150米和200米。顯然,現有的系統無法向兩只用戶提供這樣的Bird對象,所以需要修改現有的系統。我們發現,如果使用裝飾模式,不必修改原來的代碼,只需要在系統中添加“裝飾”,該系統將可以創建出用戶需要的鳥。具體設計如下所示:
1.抽象組件
在抽象組件中定義了抽象的fly(飛行)方法;
Bird.java
2.具體組件
定義具體組件Sparrow,在里面繼承抽象組件Bird類,并實現fly方法;
Sparrow.java
3.裝飾
裝飾類同樣是抽象類,并且繼承Bird,在里面實現默認構造函數和有參構造函數,并且有Bird類的引用;
Decorator.java
4.具體裝飾
根據具體的問題,具體裝飾經常委托被裝飾者調用相應的方法;
5.主程序測試
package com.xing.decorator; public class Application {public void needBird(Bird bird){System.out.println("這只鳥能夠飛行"+bird.fly()+"米");}public static void main(String[] args) {Application application=new Application();Bird sparrow=new Sparrow();//sparrow能夠飛行100米Bird sparrowDecorator1=new SparrowDecorator(sparrow);//sparrowDecorator1能飛行100+50米Bird sparrowDecorator2=new SparrowDecorator(sparrowDecorator1);sparrowDecorator1能飛行150+50米application.needBird(sparrowDecorator1);application.needBird(sparrowDecorator2);} }6.測試結果展示
5.裝飾模式的優點
1.被裝飾者和裝飾者是松耦合關系。
2.裝飾模式滿足開閉原則
3.可以使用多個具體裝飾來裝飾具體組件的實例。
總結
以上是生活随笔為你收集整理的设计模式:(装饰模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英特尔CPU命名详解:32个后缀名、8个
- 下一篇: 智能手表PSRAM芯片存储方案QPI接口