1. 程式人生 > 資訊 >大疆 DJI Mini 3 Pro 無人機更多諜照曝光:臂展更長、遙控器配備超大屏

大疆 DJI Mini 3 Pro 無人機更多諜照曝光:臂展更長、遙控器配備超大屏

裝飾器模式:就是對已經存在的某些類進行裝飾,以此來擴充套件一些功能。
下面通過現實生活中的一個示例來闡述一下裝飾器模式:

    //煎餅的抽象    
    public abstract class AbstractPancake
    {
        /// <summary>
        /// 煎餅
        /// </summary>
        public abstract string CreatePancake();

        /// <summary>
        /// 價格
        /// </summary>
        public abstract int Cost();
    }


    // 煎餅的具體類
    public class Pancake : AbstractPancake
    {
        public override int Cost()
        {
            return 5;
        }

        public override string CreatePancake()
        {
            return "山東大煎餅";
        }
    }


    ///////////配菜(具體的裝飾)

    /// <summary>
    /// 加雞蛋
    /// </summary>
    public class AddEgg : AbstractPancake
    {
        private AbstractPancake _Pancake = null;

        public AddEgg(AbstractPancake pancake)
        {
            this._Pancake = pancake;
        }

        public override int Cost()
        {
            return (int)this._Pancake.Cost() + 2;
        }

        public override string CreatePancake()
        {
            return this._Pancake.CreatePancake() + " 加雞蛋";
        }
    }

    /// <summary>
    /// 加火腿腸
    /// </summary>
    public class AddSausage : AbstractPancake
    {
        private AbstractPancake _Pancake = null;

        public AddSausage(AbstractPancake pancake)
        {
            this._Pancake = pancake;
        }

        public override int Cost()
        {
            return (int)this._Pancake.Cost() + 3;
        }

        public override string CreatePancake()
        {
            return this._Pancake.CreatePancake() + " 加火腿腸";
        }
    }


    //顧客
    public class Customer
    {
        public string Name { get; set; }

        public Customer(string name)
        {
            Name = name;
        }

        public void Buy(AbstractPancake pancake)
        {
            Console.WriteLine($"{Name} 購買了:{pancake.CreatePancake()} 一份,花費:{pancake.Cost()} 元!");
        }
    }


internal class Program
    {
        static void Main(string[] args)
        {
            //張三,要一個原味的煎餅
            Customer customer1 = new Customer("張三");
            AbstractPancake pancake = new Pancake();
            customer1.Buy(pancake);
            Console.WriteLine("***********************");

            //加雞蛋 加火腿腸
            Customer customer2 = new Customer("譚勇君");
            AbstractPancake pancake1 = new Pancake();
            pancake1 = new AddEgg(pancake1);
            pancake1 = new AddSausage(pancake1);

            customer2.Buy(pancake1);


            Console.ReadKey();
        }
    }

  

上面的程式碼以煎餅為主體,用配菜來“裝飾”煎餅,然後根據每個顧客的需求進行裝飾煎餅。
通過上面的示例可以發現裝飾器模式有以下優點:
1.裝飾類和被裝飾類可以獨立發展,而不會相互耦合。例如:AbstractPancake類無須知道裝飾類(AddEgg、AddSausage),裝飾類是從外部來擴充套件AbstractPancake類的功能,而裝飾類也不用知道具體的細節。
2.裝飾模式是繼承關係的一個替代方案,裝飾類不管裝飾多少層,他始終是一個抽象類實現的,所以他是繼承的一種良好替代方案。

裝飾器模式雖然從數量級上減少了類的數量,但是為了要裝飾,仍舊會增加很多的小類,這些具體的裝飾類的邏輯將不會非常的清晰,不夠直觀,容易令人迷惑。還就是裝飾器模式雖然減少了類的爆炸,但是在使用的時候,你就可能需要更多的物件來表示繼承關係中的一個物件,多層的裝飾是比較複雜,比如查詢問題時,被層層巢狀,不容易發現問題所在。