【朝花夕拾】設計模式之裝飾器模式

来源:https://www.cnblogs.com/edison0621/archive/2019/03/30/10628782.html
-Advertisement-
Play Games

裝飾器模式簡介 裝飾器模式是動態的向一個對象添加新的功能,並且保持其類方法簽名的完整性,換言之,其方法及繼承結構將不會被改變。這種模式一種結構型模式,是對現有類的包裝。這種模式,比生成子類更加靈活,更重要的是,裝飾者模式裝飾的是特定的行為或者或是職責,也沒有必要通過子類實現。 在日常生活中,裝飾器模 ...


 

裝飾器模式簡介

裝飾器模式是動態的向一個對象添加新的功能,並且保持其類方法簽名的完整性,換言之,其方法及繼承結構將不會被改變。這種模式一種結構型模式,是對現有類的包裝。這種模式,比生成子類更加靈活,更重要的是,裝飾者模式裝飾的是特定的行為或者或是職責,也沒有必要通過子類實現。

在日常生活中,裝飾器模式的場景更多是的打扮了,一個妹子,嫌棄自己的臉長得不夠漂亮,想換張臉很困難,但是化化妝還是很容易的(當然了,化妝也分男女的,此處指的是女士化妝,大老爺們有啥好化的,還不如收拾山河,收復釣魚島),加點粉底啊,塗點腮紅啊,塗眼影,畫眼線,再加點口紅,哇塞,一個大美女就這樣誕生了,這就是打扮的力量,這就是裝飾的力量,這也是愛美的力量。寫到這裡我突然想到一句話就是,清水出芙蓉,天然去雕飾,當自然不能使之完美時,藝術使之完美。

裝飾器模式就是,在一個已經先天不足或者未來有可能需要擴展的場景中,修改代碼將是一件工作量十分巨大的事情,也是危險繫數比較高的事情,我們需要以一個比較經濟、安全的方式來解決這個問題,可以認為是從周邊方式、從外圍方式來解決問題。

這個例子也告訴我們,生活處處是學問,紙上得來終覺淺,覺知此時要躬行,當你看到這篇文章的時候,不必太過糾結於其定義或者UML,你可以更多的去類比你的生活,這樣你會更快更深刻的獲取知識。

裝飾器模式UML類圖

zhuangshiqi

小提醒

裝飾器類繼承並依賴於更抽象一級的IWoman介面,在地位上與Face、Clothes一致
裝飾器類對IWoman介面的方法進行了包裝,隱隱約約有模板方法模式的影子

範例

以下範例,會使用前面所說的女人喜歡打扮使用打扮方式解決自然問題或者說更進一層樓的問題,女人的打扮有方方面面的,不過最常見也就是化妝和穿衣,所以此處使用這兩個裝扮方式予以Coding。

抽象介面:

   1:  public interface IWoman
   2:  {
   3:      void Attire();
   4:  }

 

臉部打扮

   1:  public class Face : IWoman
   2:  {
   3:      public void Attire()
   4:      {
   5:          Console.Write("那些年還不會打扮,擦點自己也不知道是什麼的粉");
   6:      }
   7:  }

穿衣打扮

   1:  public class Clothes : IWoman
   2:  {
   3:      public void Attire()
   4:      {
   5:          Console.Write("那些年還不會打扮,穿點屌絲裝");
   6:      }
   7:  }

裝飾器抽象類

   1:  public abstract class RougeDecorator : IWoman
   2:  {
   3:      protected IWoman woman;
   4:   
   5:      public RougeDecorator(IWoman woman)
   6:      {
   7:          this.woman = woman;
   8:      }
   9:   
  10:      public virtual void Attire()
  11:      {
  12:          this.woman.Attire();
  13:      }
  14:  }

臉部增加裝飾

   1:  public class FaceDecorator : RougeDecorator
   2:  {
   3:      public FaceDecorator(IWoman woman) : base(woman)
   4:      {
   5:      }
   6:   
   7:      public override void Attire()
   8:      {
   9:          this.woman.Attire();
  10:          Console.WriteLine("這些年學會了打扮,還要繼續化妝,塗眼影,畫眼線");
  11:      }
  12:  }

穿衣增加裝飾

   1:  public class ClothesDecorator : RougeDecorator
   2:  {
   3:      public ClothesDecorator(IWoman woman) : base(woman)
   4:      {
   5:      }
   6:   
   7:      public override void Attire()
   8:      {
   9:          this.woman.Attire();
  10:          Console.WriteLine("這些年學會了打扮,打底褲,包臀裙,上衣也要換一下,名牌穿起,還要再戴個帽子,回頭率必須杠杠的");
  11:      }
  12:  }

調用

   1:  class Program
   2:  {
   3:      static void Main(string[] args)
   4:      {
   5:          IWoman womanFace = new Face();
   6:          IWoman womanDress = new Clothes();
   7:   
   8:          IWoman womanFaceDecorator = new FaceDecorator(womanFace);
   9:          IWoman womanClothesDecorator = new ClothesDecorator(womanDress);
  10:   
  11:          womanFaceDecorator.Attire();
  12:          womanClothesDecorator.Attire();
  13:   
  14:          Console.WriteLine("----------------------------------------------------");
  15:          Console.WriteLine("完美女人出現了");
  16:          Console.WriteLine("既然完美女人已經出現了,那就抓緊娶回家,然後把裝飾器給關掉");
  17:          Console.WriteLine("卧槽,貌似有點難關呀,該死的裝飾器");
  18:          Console.WriteLine("難不倒我,把你化妝品換成路攤貨,越塗越難看,哈哈,難不倒我程式員");
  19:   
  20:          Console.ReadLine();
  21:      }
  22:  }

調用結果如下圖所示

1553947981(1)

 

裝飾器模式優缺點

優點:

  • 很好的利用了開閉原則,裝飾類和被裝飾類可以獨立發展,不會相互耦合。
  • 裝飾模式是繼承的一個替代模式,可以動態擴展一個實現類的功能

缺點:

  • 裝飾模式會使得業務及代碼變得複雜

裝飾器模式使用場景思考

裝飾器模式,從某種角度上說,可能更適合用於對已經成型的業務進行修改的場景,不管是用於動態擴展,還是動態移除,裝飾器都能很方便的勝任對對象的修改操作。另外就是,繼承也可以解決類似問題,但是裝飾器可以更好的擴展,因為,我們一般解決的是特定對象的特定行為,而不會對整個對象進行修改,這樣子跟大型重構沒有什麼區別。所以,特定場景的修改,裝飾器來的更快,更簡單,更有效率,沒有必要興師動眾。


以上為本篇文章的主要內容,希望大家多提提意見,如果喜歡記得點個贊哦


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 項目簡介: 網上招聘系統的設計與實現,包含倆個角色:個人和公司角色。本系統結構如下: 個人角色(1)首頁:顯示個人可以申請職位的公司信息,實現了查詢、申請職位功能 (2)個人信息修改:實現了對個人信息(簡歷)的修改 (3)下載簡歷:實現對簡歷的下載 (4)發佈簡歷 (5)撤銷簡歷 (6)消息通知:實 ...
  • 題目鏈接 題意 其實就是求 $$\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)$$ 思路 建議先看一下此題的一個弱化版 推一下式子 $$\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)$$ $$= \sum\l ...
  • 項目簡介: 網上體育商城的主要功能包括:前臺用戶登錄退出、註冊、線上購物、修改個人信息、後臺商品管理等等。本系統結構如下: (1)商品瀏覽模塊: 首頁瀏覽最新上市商品,按銷量排行顯示商品 實現根據商品名稱搜索商品信息 實現根據商品分類瀏覽商品 (2)登錄、註冊: 購物前需要登錄,如果沒有賬號則可以先 ...
  • 內部類 什麼是內部類? 將一個類A定義在另一個類B裡面,裡面的那個類A就稱為內部類,B則稱為外部類 成員內部類:定義在類中方法外的類 定義格式示例: 在描述事物時,若一個事物內部還包含其他事物,就可以使用內部類這種結構。 訪問特點: 內部類可以直接訪問外部類的成員,包括私有成員 外部類要訪問內部類的 ...
  • 第一個Python與Django的相容關係 1、python2.7支持到2020年 2、Django2.0後均不再支持python2 3、Django2.0是最後一個支持Python3.4的版本 4.目前為止開發學習最好用Django2.1 第二個Django與MySQL的相容關係 1、Django ...
  • 題意 "題目鏈接" Sol 線性基+線段樹分治板子題。。 調起來有點自閉。。 cpp include define fi first define se second define pb push_back define bit bitset using namespace std; const i ...
  • 老牌.NET控制項服務商,專註微軟.Net平臺的表示層與內容管理控制項 ...
  • Private Sub DS按鈕1_ButtonClick(Sender As Object) Handles DS按鈕1.ButtonClick Dim T As New Threading.Thread(AddressOf Doit) T.IsBackground = True T.Start(... ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...