1. 程式人生 > 實用技巧 >設計模式結構型之裝飾器模式

設計模式結構型之裝飾器模式

學習裝飾器模式,我們就該知道什麼叫做裝飾,就是對一個主體單位進行修飾,拿現實生活中的房子舉例,開發商把房子交給客戶之後,客戶要對房子按照自己的風格進行裝修。

下面我們用程式程式碼來描述,我們可以建立兩種房子住房(House)和公寓(Falts),讓他們繼承父類(Bulding)。程式碼如下:

    /// <summary>
    /// 房子父類
    /// </summary>
    public abstract class Buliding
    {
        public string Name
        {
            get;
            
set; } public abstract void Print(); }
    /// <summary>
    /// 住房類
    /// </summary>
    public class House : Buliding
    {
        public override void Print()
        {
            Console.WriteLine("住房已修建完成");
        }
    }
    /// <summary>
    /// 公寓類
    /// </summary>
public class Flats : Buliding { public override void Print() { Console.WriteLine("公寓已修建完成"); } }

執行一下,看一下結果:

class Program
    {
        static void Main(string[] args)
        {
            //建立一個住房
            Buliding house = new House();
            house.Print();
            
//建立一個公寓 Buliding falts = new Flats(); falts.Print(); } }

房子已經完成,接下來就該裝修了。我們來建立幾個裝飾類.

    /// <summary>
    /// 裝飾基類
    /// </summary>
    public abstract class BaseDecorator : Buliding
    {
        public abstract override void Print();
    }


    /// <summary>
    /// 水電改造
    /// </summary>
    public class WaterDianDecorator : BaseDecorator
    {
        private readonly Buliding _buliding = null;
        public WaterDianDecorator(Buliding buliding)
        {
            _buliding = buliding;
        }
        public  override void Print()
        {
            _buliding.Print();
            Console.WriteLine("完成了水電改造");
        }
    }


    /// <summary>
    /// 牆面粉刷
    /// </summary>
    public class BrushWallDecorator : BaseDecorator
    {
        private readonly Buliding _buliding = null;
        public BrushWallDecorator(Buliding buliding)
        {
            _buliding = buliding;
        }
        public override void Print()
        {
            _buliding.Print();
            Console.WriteLine("完成了牆面粉刷");
        }
    }

執行一下看一下結果。

          {
                //建立一個住房
                Buliding house = new House();   
                //水電改造
                house=new WaterDianDecorator(house);
                //牆面粉刷
                house = new BrushWallDecorator(house);
                house.Print();
                ////建立一個公寓
                //Buliding falts = new Flats();
                //falts.Print();
            }

對於house這個類來說,就像是穿了一層外衣一樣,我們可以不斷的新增新的功能,也可以改變他們的執行順序,很靈活。