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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式理解:装饰模式Decorator

發布時間:2024/10/14 asp.net 104 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式理解:装饰模式Decorator 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

裝飾模式,又稱包裝器(wrapper),該模式的使用場景是,動態的給對象擴展一些額外的職責。職責即功能,所謂“動態”表示可以任意搭配我想要的功能,功能調用的先后順序也可以任意設置。

用組合的方式來代替繼承的方式,避免子類膨脹和繼承的濫用,使“對象功能擴展”能夠根據需要來動態的擴展實現。例如在抽象類Stream中,派生了 文件流,網絡流,內存流,等如果要在著三個流上添加流的加密,流的緩存,流的加密和緩存功能,可以比較方法1繼承的實現方式和方法2組合的形式。

class Stream{ public:virtual char read(int num) = 0;virtual void seek(int num) = 0;virtual void write(int num) = 0; }; //文件流 class FileStream:Stream{ public :virtual char read(int num) {// 讀文件的功能//fileread();}virtual void seek(int num){// 查詢文件功能//fileseek();}virtual void write(int num) {//寫文件功能 //fileWrite()} };//內存流 class MemoryStream:Stream{ public :virtual char read(int num) {// 讀內存的功能//memoryread();}virtual void seek(int num){// 查詢內存功能//memoryseek();}virtual void write(int num) {//寫內存功能 //memoryWrite()} }; //加密文件流類 class CryptoFileStream : public FileStream{virtual char read(int num) {// 加密內容// crypto();// 讀文件的功能//fileread();}virtual void seek(int num){// 加密內容// crypto();// 查詢文件功能//fileseek();// 解密內容// decrypto();}virtual void write(int num) {// 加密內容// crypto();//寫文件功能 //fileWrite()} }; //加密內存流 class CryptoMemoryStream: public:MemoryStream{ public :virtual char read(int num) {// 加密內容// crypto();// 讀內存的功能//memoryread();}virtual void seek(int num){// 加密內容// crypto();// 查詢內存功能//memoryseek();// 解密內容// decrypto();}virtual void write(int num) {// 加密內容// crypto();//寫內存功能 //memoryWrite()} };

第一種方法實際上就是濫用繼承的例子:假如現有一個需求“需要給文件流網絡流新增一個緩存的功能”,按照第一種的設計方式是不是要在派生出 ”緩存文件流類“,”緩存網絡流類“呢?假如需要再新增一個網絡流,按照第一種方法是不是要新增一個繼承Stream 的網絡流類,再派生出 “加密網絡流類”,"緩存網絡流類" 呢? 實際上,第一種的設計存在很大的代碼冗余,文件流,內存流,網絡流等實體類在加密時的過是一樣的,即“穩定”,唯一變化的實際上是讀查寫操作。文件流和加密文件流之間的關系實際上并不應是“父子關系”,繼承的正確使用場景應是業務理論上面的細化,例如平行四邊形和矩形的關系,矩形和正方形的關系,而功能上的擴展不應該用繼承,而應該用組合,例如“正方形 與 涂上顏色的正方形之間的關系”就不該用繼承。

裝飾模式實際上就是組合

class Stream{ public:virtual char read(int num) = 0;virtual void seek(int num) = 0;virtual void write(int num) = 0; }; //文件流 class FileStream:Stream{ public :virtual char read(int num) {// 讀文件的功能//fileread();}virtual void seek(int num){// 查詢文件功能//fileseek();}virtual void write(int num) {//寫文件功能 //fileWrite()} };//內存流 class MemoryStream:Stream{ public :virtual char read(int num) {// 讀內存的功能//memoryread();}virtual void seek(int num){// 查詢內存功能//memoryseek();}virtual void write(int num) {//寫內存功能 //memoryWrite()} }; //功能裝飾流類 class DecoratorStream : public Stream{protected:Stream * stream;public:DecoratorStream(Stream * s ):stream(s){} }; //流加密 class CryptoStream: public DecoratorStream { public :CryptoStream( Stream *s):DecoratorStream (s){}virtual char read(int num) {// 加密內容// crypto();stream ->read();}virtual void seek(int num){// 加密內容// crypto();// 查詢stream ->seek();// 解密內容// decrypto();}virtual void write(int num) {// 加密內容// crypto();//寫功能 stream ->Write()} }; //流緩存 class BufferStream: public DecoratorStream { public :BufferStream( Stream *s):DecoratorStream (s){}virtual char read(int num) {//讀緩存if(bufferread() == null){stream ->read();//寫緩存內容bufferwrite(); }}virtual void seek(int num){//讀緩存if(bufferread() == null){stream ->seek();//寫緩存內容bufferwrite(); }}virtual void write(int num) {//寫功能 stream ->Write()bufferwrite(); } }; /// void main(){Stream* fstream = new FileStream();fstream->write() ; //寫文件Stream * cryptofstream = new CryptoStream(fstream) ;cryptofstream ->write() ; // 加密寫文件Stream * buffercryptofstream = new BufferStream(cryptofstream) ;buffercryptofstream ->write () ; //先緩存后加密寫文件 }

上述就是裝飾模式,如果 DecoratorStream 類沒有繼承Stream ,那么就不支持先緩存后加密寫文件的功能,繼承了Stream就表示裝配了該功能后還是個stream對象。DecoratorStream類中沒有Stream * stream; 成員指針,那么就沒法進行功能上的裝飾,和方法1比起來,大大簡化了代碼,擺脫了繼承的濫用。增強了可維護性,將來如果“細化5個流的實體類和5個流的功能”方法1需要新增的類的數量就是巨大的,而方法而只需要新增10個就可在實現流功能的任意搭配。

?

?

?

總結

以上是生活随笔為你收集整理的设计模式理解:装饰模式Decorator的全部內容,希望文章能夠幫你解決所遇到的問題。

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