裝飾者模式是一個很精美且優雅的模式
本篇範例 文字內容->AES加密->Zip檔附加密碼->輸出儲存
情境
有個需求要做
文字內容->壓縮zip(附上密碼)->輸出儲存
又改成…文字內容->AES加密->輸出儲存
需求又改成….文字內容->AES加密->Zip檔附加密碼->輸出儲存
可發現需求一直在對於文字內容操作順序做變化,但他們核心離不開對於文字內容的操作
這種情境很適合來使用 [裝飾者模式]
裝飾者模式 有兩個主要角色 被裝飾物件(Decorated) & 裝飾物件(Decorator)
- 被裝飾物件(Decorated)就像蛋糕的一樣,
- 裝飾物件(Decorator)就是上的水果,奶油,巧克力…等等裝飾物品
一般先有蛋糕被裝飾物件(Decorated),後再將裝飾物品加上去裝飾物件(Decorator)
被裝飾物件(Decorated)如下圖 蛋糕的原型
圖片來源
- 將物件有效的往上附加職責,不動到內部的程式碼, 在原來職責上附加額外的職責
- 裝飾者模式運作就像 俄羅斯娃娃一樣 一層包一層
圖片來源
第一步 先找尋他們共同裝飾東西,因為是讀寫檔案 所以我們可以對於Byte下手
先做出 讀 跟 寫 介面簽章當作裝飾動作的統一介面
1 | public interface IProcess |
在創建一個 ProcessBase 給日後裝飾物品(Decorator)來繼承
1 | public abstract class ProcessBase : IProcess |
有兩點特別說明
protected IProcess _process;
儲存被裝飾的物件由SetDecorated
方法來設置被裝飾的物件- 就像俄羅斯娃娃只包裹一個娃娃,不管被包裹娃娃之前包含哪些娃娃
第二步 創建被裝飾物品(Decorated)
因為是檔案我們直接使用
- File.ReadAllBytes 讀 檔案
- File.WriteAllBytes 寫 檔案
1 | /// <summary> |
第三步 創建裝飾物品(Decorator)
這次主要裝飾物品有兩個
- 加壓解壓ZIP檔
- 加解密
加密裝飾器繼承ProcessBase
並按照加解密重寫 Write
和 read
方法
1 | /// <summary> |
這次讀寫zip使用 SharpZipLib 開源第三方插件
ZIP裝飾器繼承ProcessBase
並按照加解密重寫 Write
和 read
方法
1 |
|
上面就把我們要用的裝飾物品 (備料) 準備完成
第四步 創建使用(開始擺盤)
創建一個 DecorateFactory
來當生產 裝飾產品的工廠
建構子傳入一個 被裝飾的物件(FileProcess
) 之後可依照喜好一直疊加 裝飾物品(ZipProcess
,AESCrypProcess
…)
1 | public class DecorateFactory |
裝飾者模式 裝飾的順序是很重要的
為了方便讀者閱讀 我使用小畫家畫出 讀寫順序
如下圖
使用就可很清晰來用
DecorateFactory
來創建裝飾流程factroy.GetProcess();
方法取得完成後的產品
在簡單呼叫讀和寫方法
1 | string filePath = @"C:\Users\daniel.shih\Desktop\test.zip"; |
日後不管需求是改成
- 文字內容->壓縮zip(附上密碼)->輸出儲存
- 文字內容->AES加密->輸出儲存
- 文字內容->AES加密->Zip檔附加密碼->輸出儲存
還是…..
我們都不怕因為我們把各種操作封裝
和多態
各個模組間都是獨立的很好映證 高內聚低耦合
的設計原則
小結:
裝飾者模式是一個很精美且優雅的模式 希望這篇文章可讓讀者對於此模式有更加了解
GitHub範例連結
此文作者:Daniel Shih(石頭)
此文地址: https://isdaniel.github.io/decorator-pattern/
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!