天天看點

設計模式之裝飾模式

    學習設計模式已經有段時間了,初接觸設計模式。雖然樣例簡單、生動。但還是感覺非常是抽象。今天又學習了設計模式中的裝飾模式,也就是裝飾模式讓自己對模式略有所懂,裝飾模式最大的特點就是把全部須要的功能都按正确的順序串聯起來進行控制。

這裡須要強調的是“順序”,也就是說這樣的裝飾是建立在一定的順序之上的,并且這樣的順序是由人為控制的。不同于建造者模式,它的順序是固定不變的。

**概念

    動态地給一個對象加入一些額外的職責,就添加的功能來說。裝飾模式比生成子類更為靈活。

**結構圖

設計模式之裝飾模式

    Component是定義了一個對象接口。能夠給這些對象動态地加入職責。

ConcreteComponent是定義了一個詳細的對象,也能夠給這個對象加入一些職責。Decorator,抽象裝飾類,繼承了Component,從外類來擴充Component類的功能。但對于Component來說。是無需知道Decorator的存在的。

至于ConcretrDecorator就是詳細的裝飾對象,起到給Component加入職責的功能。

**執行個體解析

    以下以小明(代碼中的詳細對象)的着裝為例,進行詳細解析:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 裝飾模式_終極版_
{
    class Program
    {
        //Person類
        class Person
        {
            public Person()
            { }

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

            public virtual void show()
            {
                Console.WriteLine("裝扮的{0}", name);
            }
        }

        //服飾類
        class Finery : Person
        {
            protected Person component;

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

            public override void show()
            {
                if (component != null)
                {
                    component.show();
                }
            }
        }

        //詳細服飾類
        class Tshirts : Finery
        {
            public override void show()
            {
                Console.Write("大體恤");
                base.show();
            }
        }

        class BigTrous : Finery
        {
            public override void show()
            {
                Console.Write("垮褲");
                base.show();
            }
        }

        class Sneakers : Finery
        {
            public override void show()
            {
                Console.Write("破球鞋");
                base.show();
            }
        }

        class Suit :Finery
        {
            public override void show()
               {
                Console.Write("西裝");
                base.show();
                }
        } 
        class Tie : Finery
        { 
            public override  void show()
            {
            Console.Write("領帶");
            base.show();
            }

        }

        class LeatherShoes:Finery 
        {
            public override void show()
            {
                Console.Write("皮鞋");
                base.show();
            }

        }
        static void Main(string[] args)
        {
            Person xc = new Person("小明");

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

            Sneakers pqx = new Sneakers();
            BigTrous kk = new BigTrous();
            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();
        }
    }
}      

在這個樣例中并沒有抽象的Component類,将其和ConcreteComponent類合并為“人”的類,詳細結構圖例如以下:

設計模式之裝飾模式

執行的詳細結果為:

設計模式之裝飾模式

    在這裡為什麼會出現這種結果,為什麼會是這種“打扮”,又是為什麼出現了這種順序。接下來将為您做具體的介紹(以第一種裝扮為例):

    Sneakers執行個體化了pqx ,BigTrouser 執行個體化了kk,TShirts執行個體化了dtx。然後pqx包裝xc(也就是這個樣例中的小明)。kk包裝pqx,dtx包裝kk,最後運作dtx.Show(),依照執行個體化的相反順序依次實作了對xc的包裝,也就是以上截圖中顯示的結果。

**長處

    ①把類中的裝飾功能從類中搬移去除。這樣能夠簡化原有的類。

    ②有效地把類的核心職責和裝飾功能區分開來。并且能夠去除相關類中反複飛裝飾邏輯;

**遺憾

    雖然對裝飾模式有了些許了解,可是對于裝飾過程部分還有諸多的不了解。希望大家多多不吝賜教。鄙人在此謝過了。