設計模式之裝飾模式

来源:http://www.cnblogs.com/cqxhl/archive/2016/11/24/6097411.html
-Advertisement-
Play Games

1、類圖 2、創建項目 ………………………… 3、 VisualComponent:抽象界面構件類,充當抽象構件類 為了突出與模式相關的核心代碼,咋基本實例中對空間代碼進行了簡化。 namespace DecoratorSample { /// <summary> /// 抽象構件類 /// </s ...


1、類圖

2、創建項目

…………………………

3、 VisualComponent:抽象界面構件類,充當抽象構件類

為了突出與模式相關的核心代碼,咋基本實例中對空間代碼進行了簡化。

namespace DecoratorSample

{

    /// <summary>

    /// 抽象構件類

    /// </summary>

    abstract class VisualComponent

    {

        /// <summary>

        /// 抽象方法:顯示控制項

        /// </summary>

        public abstract void Display();

    }

}

4、 Window:窗體類,充當具體構件類

using System;

namespace DecoratorSample

{

    /// <summary>

    /// 具體構件類:Windows,該類實現構建類的基本功能

    /// </summary>

    class Window : VisualComponent

    {

        public override void Display()

        {

            Console.WriteLine("窗體構件——顯示窗體!");

        }

    }

}

5、 TextBox:文本框類,充當具體構件類。

using System; 

namespace DecoratorSample

{

    /// <summary>

    /// 具體構件類:TextBox,該類實現構建類的基本功能

    /// </summary>

    class TextBox : VisualComponent

    {

        public override void Display()

        {

            Console.WriteLine("顯示文本框!");

        }

    }

}

6、 ListBox:列表框類,充當具體構件類 

using System;

namespace DecoratorSample

{

    /// <summary>

    /// 具體構件類:ListBox,該類實現構建類的基本功能

    /// </summary>

    class ListBox : VisualComponent

    {

        public override void Display()

        {

            Console.WriteLine("顯示列表框!");

        }

    }

}

7、 ComponentDecorator:構件裝飾類,充當抽象裝飾類。

namespace DecoratorSample

{

    /// <summary>

    /// 抽象裝飾類,該類為抽象構件類的子類,負責實現構件的複雜功能

    /// </summary>

    class ComponentDecorator : VisualComponent

    {

        private VisualComponent component;  //維持對抽象構件類型對象的引用

 

        /// <summary>

        /// 註入抽象構件類型的對象,即註入具體構件類,此構造函數非常重要

        /// </summary>

        /// <param name="component"></param>

        public ComponentDecorator(VisualComponent component)

        {

            this.component = component;

        }

        /// <summary>

        /// 實現註入構件的基本功能

        /// </summary>

        public override void Display()

        {

            component.Display();//調用註入的具體構件的方法

        }

    }

8、 ScrollBarDecorator:滾動條裝飾類,充當具體裝飾類

using System;

namespace DecoratorSample

{

    /// <summary>

    /// 滾動條裝飾類,該類為具體裝飾類

    /// </summary>

    class ScrollBarDecorator : ComponentDecorator

    {

        public ScrollBarDecorator(VisualComponent component)

            : base(component)

        {

        }

        /// <summary>

        /// 再次重寫基類的基本方式,實現裝飾構件的裝飾:即實現構件的基本方法,也實現新增加的方法

        /// </summary>

        public override void Display()

        {

            this.SetScrollBar();

            base.Display();

        } 

        /// <summary>

        /// 設置滾動條,此方法為裝飾的增加的新方法

        /// </summary>

        public void SetScrollBar()

        {

    Console.WriteLine("為構件增加滾動條!");

    }

    }

9、 BlackBorderDecorator:黑色邊框裝飾類,充當具體裝飾類

using System;

namespace DecoratorSample

{

    /// <summary>

    /// 帶黑色邊框的裝飾類,該類為抽象構件類的子類

    /// </summary>

    class BlackBorderDecorator : ComponentDecorator

    {

        public BlackBorderDecorator(VisualComponent component)

            : base(component)

        {

        }

        /// <summary>

        /// 再次重寫基類的基本方式,實現裝飾構件的裝飾:即實現構件的基本方法,也實現新增加的方法

        /// </summary>

        public override void Display()

        {

            this.SetBlackBorder();

            base.Display();

        }

        /// <summary>

        /// 新增加的方法,實現黑色邊框

        /// </summary>

        public void SetBlackBorder()

        {

    Console.WriteLine("為構件增加黑色邊框!");

    }

    }

10、 Program:客戶端測試類

using System;

namespace DecoratorSample

{

    class Program

    {

        static void Main(string[] args)

        {

            //以下演示透明裝飾的使用

 

            VisualComponent component;             //抽象構件

            VisualComponent componentScrollBar;    //帶滾動條的裝飾構件

            VisualComponent componentBlackBorder;  //帶黑色邊框的裝飾構件         

            component = new Window(); //定義具體構件

            Console.WriteLine("準備構件" + component.ToString());

            componentScrollBar = new ScrollBarDecorator(component); //進行滾動條裝飾,參數為需要裝飾的構件

            componentBlackBorder = new BlackBorderDecorator(componentScrollBar); //將裝飾了一次之後的對象繼續註入到另一個裝飾類中,進行第二次裝飾

            componentBlackBorder.Display();

            Console.Read();

        }

    }

}

11、 結果及分析

 


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

-Advertisement-
Play Games
更多相關文章
  • 頁面引用相應的js以及css 因為SpreaJS是用jquery操作的所以要引用一個jquery的js,第二個js以及最後的css是SpreaJS本身需要引用的,第三個js是做列印才會用到的。 html里只需要放一個div就可以了,相當於SpreaJS的容器。 <div id="ss" style= ...
  • 一、前言 1.0、由於沒有寫過那種通用爬蟲的框架,就四處搜了一下,也找到很多資料,這裡就採用了其中一個大神介紹的框架模式。具體引用地址我忘記了,這裡就不貼出來了。 2.0、之前說的驗證碼模塊也停了,到時候集合在這個分類一面一起說 二、正文 2.1、框架設計圖 2.2、由上面這張圖可以看出各個模塊之間 ...
  • 感謝您的閱讀。喜歡的、有用的就請大哥大嫂們高抬貴手“推薦一下”吧!你的精神支持是博主強大的寫作動力以及轉載收藏動力。歡迎轉載! 版權聲明:本文原創發表於 【請點擊連接前往】 ,未經作者同意必須保留此段聲明!如有問題請聯繫我,侵立刪,謝謝! 我的博客:http://www.cnblogs.com/GJ ...
  • 完善了下 文件中的文件及文件夾中的複製!如果有更優解決方案請不吝指教 protected void FileDepthCopy(string source, string target) { if (Directory.Exists(source))//判斷源文件是否存在 { if (!Direct ...
  • 常用的一些開源組件整理: 導出Excel報表的插件:NOPI.dll(基於微軟OpenXml實現)開源的作業調度和自動任務框架:Quartz.NET用於大數據搜索引擎的全文檢索框架:Lucene.net微軟針對企業級應用開發的最佳實踐組件:Enterprise Library 5.0國外一個牛人寫的 ...
  • MVVM是一個比較熱門的開發框架,儘管已經出現很久了,仍然比較受歡迎。MVVM框架包括: M:Model;Model指的是數據模型,例如你要在頁面展示聯繫人信息,那麼Model就是聯繫人的模型,包括聯繫人的名字,電話號碼,頭像等。。。 V:View;View指的是展示的頁面,比如你所現在看到的這篇文 ...
  • 在項目開發過程中,有時會需要用到調用第三方程式實現本系統的某一些功能,例如本文中需要使用到的swftools插件,那麼如何在程式中使用這個插件,並且該插件是如何將PDF文件轉化為SWF文件的呢?接下來就會做一個簡單的介紹。 在.NET平臺中,對C#提供了一個操作對本地和遠程的訪問進程,使能夠啟動和停 ...
  • 本次活動,只是一個嘗試,也許效果好,也許效果差,但不嘗試一下,又怎麼知道呢~~~~最後謝謝大伙的支持! ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...