2016年2月29日 星期一

裝飾模式 Decorator Pattern

PM: 小奇,這次轉蛋活動營收不錯ㄟ~
我:   是喔~恭喜
PM: 所以我想再弄一個活動
PM: 就是把轉蛋轉到的裝備可以再次轉蛋
我:   .........
PM: 就是可利用轉蛋把裝備加上隨機四種屬性
PM: 例如XX裝備去轉蛋,轉蛋之後隨機增加裝備屬性
PM: 範例1: 力量 + 178  體 + 587 敏捷 + 20 智慧 + 50
PM: 範例2: 力量 + 58  體 + 1500 敏捷 + 35 智慧 + 98
PM: 轉一次50元,應該又可以在賺一波
我:   好的,交給我!
PM: 對了小奇,我可能還會加其他屬性,留點空間新增喔~

PM這次的需求一個某件裝備,可以加上N種屬性
再次翻一翻書,好像裝飾模式可以使用,來套套看好了!!

於是乎新增了一個
Armor.cs
using System;

namespace DesignPattern.DecoratorPattern
{
    /*裝備*/
    class Armor
    {
        public Armor()
        {}

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

        public virtual void Show()
        {
            Console.WriteLine("[" + name + "]");
        }
    }

    /*屬性*/
    class Attribute : Armor
    {
        protected Armor component;
        public void Decorate(Armor component)
        {
            this.component = component;
        }

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

    /*力量屬性*/
    class STR : Attribute
    {
        private int _val { get; set; }
        public STR(int val)
        {
            _val = val;
        }
        public override void Show()
        {
            Console.Write(" 力量 +" + _val);
            base.Show();
        }
    }

    /*體力屬性*/
    class CON : Attribute
    {
        private int _val { get; set; }
        public CON(int val)
        {
            _val = val;
        }
        public override void Show()
        {
            Console.Write(" 體力 +" + _val);
            base.Show();
        }
    }

    /*敏捷屬性*/
    class DEX : Attribute
    {
        private int _val { get; set; }
        public DEX(int val)
        {
            _val = val;
        }
        public override void Show()
        {
            Console.Write(" 敏捷 +" + _val);
            base.Show();
        }
    }

    /*智慧屬性*/
    class WIT : Attribute
    {
        private int _val { get; set; }
        public WIT(int val)
        {
            _val = val;
        }
        public override void Show()
        {
            Console.Write(" 智慧 +" + _val);
            base.Show();
        }
    }

    /*智力屬性*/
    class INT : Attribute
    {
        private int _val { get; set; }
        public INT(int val)
        {
            _val = val;
        }
        public override void Show()
        {
            Console.Write(" 智力 +" + _val);
            base.Show();
        }
    }

    /*精神屬性*/
    class MEN : Attribute
    {
        private int _val { get; set; }
        public MEN(int val)
        {
            _val = val;
        }
        public override void Show()
        {
            Console.Write(" 精神 +" + _val);
            base.Show();
        }
    }

}
新增主控台程式
Run.cs
using System;

namespace DesignPattern.DecoratorPattern
{
    class Run
    {
        static void Main()
        {
            Random rnd = new Random();
            
            Armor ar = new Armor("金屬盔甲");       /* 裝備*/

            /*PM第一種組合屬性*/
            STR str = new STR(rnd.Next(100));           
            str.Decorate(ar);  
            DEX dex = new DEX(rnd.Next(100));      
            dex.Decorate(str);
            CON con = new CON(rnd.Next(1000)); 
            con.Decorate(dex);
            WIT wit = new WIT(rnd.Next(500));       
            wit.Decorate(con);
            wit.Show();

            /*PM第二種組合屬性*/
            MEN men = new MEN(rnd.Next(100));
            men.Decorate(ar);
            INT _int = new INT(rnd.Next(100));
            _int.Decorate(men);
            _int.Show();

            Console.Read();
        }
    }
}

沒有留言:

張貼留言