1. 程式人生 > >【設計模式】——裝飾模式(Decorator)

【設計模式】——裝飾模式(Decorator)

裝飾模式(Decorator):動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。

就以穿衣服為例,無論是鞋子、領帶、披風都是對人的裝飾。

定義一個人類

<strong><span style="font-family:KaiTi_GB2312;"> class Person
    {
        public Person()
        { }

        private string name;
        public Person(string name)
        {
            this.name = name;
        }

        public virtual void Show()
        {
            Console.WriteLine("裝扮的{0}",name );
        }
    }</span></strong>

服飾類
<strong><span style="font-family:KaiTi_GB2312;"> class Finery :Person 
    {
        protected Person component;

        //打扮

        public  void Decorate(Person component)
        {
            this.component = component;
        }

        public override void Show()
        {
            if (component !=null )
            {
                component.Show();
            }
        }
    }</span></strong>

各衣服的類

<strong><span style="font-family:KaiTi_GB2312;">//垮褲
    class BigTrouser : Finery
    {
        public override void Show()
        {
            Console.Write("垮褲");
            base.Show();
        }
    }</span></strong>
</pre><pre name="code" class="csharp"><strong><span style="font-family:KaiTi_GB2312;">//皮鞋 </span></strong>
<strong><span style="font-family:KaiTi_GB2312;">class LeatherShoes : Finery
    {
        public override void Show()
        {
            Console.Write("皮鞋");
            base.Show();
        }
    }</span></strong>
</pre><pre name="code" class="csharp"><strong><span style="font-family:KaiTi_GB2312;"> //破球鞋
    class Sneakers : Finery
    {
        public override void Show()
        {
            Console.Write("破球鞋");
            base.Show();
        }
    }</span></strong>
</pre><pre name="code" class="csharp"><strong><span style="font-family:KaiTi_GB2312;">//西裝 </span></strong>
<strong><span style="font-family:KaiTi_GB2312;">class Suit : Finery
    {
        public override void Show()
        {
            Console.Write("西裝");
            base.Show();
        }
    }</span></strong>
</pre><pre name="code" class="csharp"><strong><span style="font-family:KaiTi_GB2312;">//領帶</span></strong>
<strong><span style="font-family:KaiTi_GB2312;"> class Tie : Finery
    {
        public override void Show()
        {
            Console.Write("領帶");
            base.Show();
        }
    }</span></strong>
</pre><pre name="code" class="csharp"><strong><span style="font-family:KaiTi_GB2312;">//大T恤</span></strong>
<strong><span style="font-family:KaiTi_GB2312;">class Tshirts :Finery 
    {
        public override void Show()
        {
            Console.Write("大T恤");
            base.Show();
        }
    }</span></strong>

客戶端程式碼
<strong><span style="font-family:KaiTi_GB2312;"> class Program
    {
        static void Main(string[] args)
        {
            Person xc = new Person("小菜");

            Console.WriteLine("\n第一種裝扮:");

            Sneakers pqx = new Sneakers();
            BigTrouser kk = new BigTrouser();
            Tshirts dtx = new Tshirts();

            pqx.Decorate(xc);
            kk.Decorate(pqx );
            dtx.Decorate(kk);
            dtx.Show();

            Console.WriteLine("\n第二種裝扮");

            LeatherShoes px = new LeatherShoes();
            Tie ld = new Tie();
            Suit xz = new Suit();

            px.Decorate(xc);
            ld.Decorate(px );
            xz.Decorate(ld );
            xz.Show();

            Console.Read();
        }
    }</span></strong>

效果:




裝飾模式把每個要裝飾的功能放在單獨的類中,並讓這個類包裝它所要裝飾的物件,當需要只想特殊行為時,客戶程式碼就可以在執行時根據需要有選擇地、按順序地使用裝飾功能包裝物件。

我理解的是,我們每個人都是一個客戶端,我們的每一件衣服就是一個已經包裝好了的類,當我們使用裝飾模式時,就相當於我們在打扮自己,我們選擇穿哪一件衣服,穿衣服的順序等等。


相關推薦

設計模式裝飾Decorator模式

讓我 分享圖片 底部 .com 一件事 輸出 PE 新的 int 設計模式:裝飾器(Decorator)模式 一、前言 裝飾器模式也是一種非常重要的模式,在Java以及程序設計中占據著重要的地位。比如Java的數據流處理,我們可能看到數據流經過不同的類的包裝和包裹,最

設計模式裝飾Decorator模式

首先來看一個場景,如圖: 工人分為很多種類,比如電工,管道工等等,同時又有A公司的電工,B公司的電工,A公司的管道工,B公司的管道工等等,那麼當有M個工種和N個公司的時候,就會有 M * N 個子類,這個繼承體系就會變得很龐大和複雜。那麼如何簡化呢,那麼

設計模式——裝飾模式Decorator

裝飾模式(Decorator):動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 就以穿衣服為例,無論是鞋子、領帶、披風都是對人的裝飾。 定義一個人類 <s

設計模式7—— 結構型 —— 裝飾Decorator

介紹 定義:在不改變原有物件基礎之上,將功能附加到物件上 說明:在擴充套件原有物件功能方面,提供了比繼承更有彈性的替代方案 型別:結構型 適用場景: 擴充套件一個類的功能或給一個類新增附加職責 動態地給一個

設計模式——裝飾模式

【裝飾模式】 裝飾模式是利用component來對物件進行包裝。每個裝飾物件的實現就和如何使用這個物件分離開了,每個裝飾物件只關心自己的功能,不需要關心如何被新增到物件鏈當中 【介紹】 主要解決:一般的,我們為了拓展一個類經常使用繼承方法實現,由於繼承為類引入靜

設計模式-附錄A1

一.什麼是設計模式? “每一個模式描述了一個在我們周圍不斷重複發生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重複的勞動” 二.面向物件,面向過程的區別和聯絡 面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步的實現,使用的時候一個

java設計模式之 代理Proxy模式

代理模式的核心作用就是通過代理,控制對物件的訪問。這跟實際中是一樣的,比如說明星都有經紀人,這就是一個代理,比如有人要找某明星拍戲,那麼首先處理這事的是他的經紀人,雖然拍戲需要自己拍,但是拍戲前後的一些必須要做的事等等,都由這個經紀人來處理。    在程式中也是如此,通過

設計模式裝飾模式

能力要求:抽象能力 + 業務知識 設計要結合具體的業務,如果業務知識不夠,常常容易出現設計過度的現象——那些不常變的地方,簡單即可。事實上,很多良好的設計都是迭代而來的,設計並非一成不變,如果從一開始就想設計好,很容易陷入過度設計。 Q:設計一個類,其職責是

註冊碼Matlab7.0R14註冊碼

.com power baidu spf 註冊 word kdt iyu https Matlab 7 (R14) 註冊碼1:14-13299-56369-16360-32789-51027-35530-39910-50517-56079-43171-43696-14148

Python初學者合並拼接字符串

Python【Python初學者】合並(拼接)字符串

總結整理地圖投影

相對 十分 body 角度 投影 解析 經緯度坐標 福特 曲面 1.地球橢球體 地球是一個表面很復雜的球體,人們以假想的平均靜止的海水面形成的“大地體”為參照,推求出近似的橢球體,理論和實踐證明,該橢球體近似一個以地球短軸為軸的橢園而旋轉

Day22 小程序Credit CardATM,購物程序調用信用卡程序接口支付

logger nts 實現 管理 加載 相關 actions bin 目錄 程序介紹:   實現信用卡(ATM)常用功能:(支持多賬戶登陸)1.取款;2.還款;3.轉賬;4.查詢余額;5.查詢賬單(流水,支持按年月日時分秒記錄); 程序結構:ATM/├── README├─

Python 裝飾Decorator

highlight () 註冊 內部 AI 面積 return 使用 工作 裝飾器的語法為 @dec_name ,置於函數定義之前。如: import atexit @atexit.register def goodbye(): print(‘Goodbye

(轉)python裏為什麽需要使用裝飾decorator

上線 深入 add 指導 對象 引用 是否 寫代碼 學習 出處 為什麽需要使用裝飾器呢?其實很多人學習python之後都會問這個問題。這一次,我來深入地學習一下什麽是裝飾器,以及為什麽需要它。其實這個裝飾器就是我們這樣的程序員太“懶”了,基本上什麽

Absible學習Ansible playbook

tags 列表 最好 test list playbook ppi -m color * 簡介 執行一些簡單的任務,使用ad-hoc命令可以方便的解決問題,但是有時一個設施過於復雜,需要大量的操作時候,執行的ad-hoc命令是不適合的,這時最好使用playbook。play

AtCoder - 4242 To Infinity思維

題幹: Problem Statement Mr. Infinity has a string S consisting of digits from 1 to 9. Each time the date changes, this st

OpenAI-Gym學習記錄gym安裝

前言 最近在學習強化學習( Reinforcement Learning ),自學過程包括理論學習部分與演算法學習部分。理論學習部分安利一本書籍 Richard S. Sutton 的 Reinforcement Learning : An Introduction;演算法學習主要為使用

2018.11.07校內模擬數獨模擬

傳送門 解析: 直接模擬,隨手寫了一個壓位的二進位制優化數獨,並沒有什麼用,好處只有搜尋才能體現出來吧。。。 程式碼: #include<bits/stdc++.h> using namespace std; #define ll long lon

POJ 3368Frequent valuesRMQ

Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you a

Short Brain——mini-story

What The guy named Joe. He wanted to be a famous movie star. So the first he get thin and have the good body. The he stopped eating dairy prod