日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

装饰器模式(讲解+应用)

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 装饰器模式(讲解+应用) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自?設計模式(5)裝飾器模式(講解+應用)

目錄

  • 裝飾器模式

  • 為什么使用裝飾器模式

  • 應用實例

  • 裝飾器模式

    看到裝飾器是在看《Thinking in Java》一書的時候,看到文件讀寫那邊的時候,有提到裝飾器模式,同時在文件讀寫的那一部分,對于各種讀入,寫出的方式,代碼組織結構感覺也是比較怪的,怪的總是吸引人的。

    裝飾器模式:在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

    通過使用裝飾器模式,我們可以實現關閉原有代碼,開放現有代碼的方式來實現更多的功能。通過減少對原有代碼的改變,來降低犯錯誤的幾率。不改變妹子的三圍,通過裝飾不同的制服,實現一個動態擴展,我們就會看到教師,護士,,,其本質功能還是未改變的,只是體驗更上一層樓。。。

    為什么使用裝飾器模式

    繼續上面的需求來舉例子吧,現在我們要針對該服務場所制定一個訂單系統,當客戶來選擇的時候,點一項服務,我們需要向訂單中加入一項,然后最后計算一個總和,由于young woman,student,nurse等基礎價格是不同的,假設在其基礎之上的單項服務價格是相同的,首先我們想到的可能是根據不同的類型繼承自一個基類,建立一個類,然后每個作為一個實例,將各項服務作為一個全局變量,然后各項服務有一個set方法,用來改變這些服務的狀態,兩次調用可以取消該服務,默認各項服務的狀態是關閉的,然后最后通過一個cost方法判斷各種服務的來計算總價格,當然感覺這是一個很不錯的方法。但是由于某種服務的特殊性原因,能提供該服務的人減少,所以該服務價格上漲,或者是在某種服務在一個不小心中誕生,因此,我們需要打開源代碼進行添加一些服務,然后需要添加set方法,同時,我們需要對cost進行修改,隨著人民思路不斷開闊,冒險精神日益增強,各種服務如雨后春筍,我們的維護工作將變得比工作人員還要辛苦了。這個時候,就要引出我們的裝飾器模式,我們將所有需要付費的拿出來,因為我們在后期的維護上,就是價格導致的變化給我們帶來了困擾,所以如果將這些變化的價格拿出來,單獨維護,我們的工作量將會減少。如下結構

    //基礎抽象類 public abstract class SexService{String description = "Best Service";public String getDescription(){return description;}public abstract int cost(); } //繼承自抽象類的本體 public class Nurse extends SexService{public Nurse(){description = "You konw";}public int cost(){return 150;} } //繼承自基礎類的用來修飾本體的類 public class PlayXiao extends SexService{SexService service;public PlayXiao(SexService service){this.service = service;}public String getDescription(){return service.getDescription+"PlayXiao";}public int cost(){return service.cost+50;}}

    調用方式

    Nurse sweetHeart = new Nurse(); sweetHeart = new PlayXiao(sweetHeart);

    首先我們創建一個本體類,然后將其作為一個實例通過構造函數注入到一個裝飾類,在裝飾類內部通過委托的形式獲得當前的價格和描述,同時由于本體類和裝飾類繼承自同一個基類,所以可以用來繼續向下傳遞。
    基礎抽象類,通過構造函數進行實例注入,通過委托實現狀態,數據更新,從而實現關閉原有代碼,開放現有代碼。

    應用實例

    言歸正傳,回到正題上來,講一下其在我們平常開發中的例子
    開始也提到了一點關于Java,io庫的問題
    java I/O庫具有兩個對稱性,它們分別是:

  • 輸入-輸出對稱:比如InputStream 和OutputStream 各自占據Byte流的輸入和輸出的兩個平行的等級結構的根部;而Reader和Writer各自占據Char流的輸入和輸出的兩個平行的等級結構的根部。

  • byte-char對稱:InputStream和Reader的子類分別負責byte和Char流的輸入;OutputStream和Writer的子類分別負責byte和Char流的輸出

  • 這些作為根類,如果我們想通過緩沖,字節,或者是管道,這個時候我們就需要使用裝飾器來進行裝飾,然后通過裝飾器來實現相應的操作,根類具有read方法,對于裝飾類,通過構造函數將基類的一個實例注入進去,然后通過委托模式,首先通過基類的read方法獲取字節流,然后根據相應的操作,實現字節讀取等。

    InputStreamReader input = new InputStreamReader(System.in); BufferedReader reader = new BufferedReader(input); String line = reader.readLine();

    總結

    以上是生活随笔為你收集整理的装饰器模式(讲解+应用)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。