C#--設計模式--模板方法設計模式

      模板設計模式,是處理程序按照某中順序執行,通過類和行爲分離,來處理的設計模式之一。主要是是關注類和行爲之間的分離。



    生活實例,假如今天4S店購買了大奔一輛(你現在也是有車一族了),付款後,你每次需要駕車外去,都需要操作一下步驟:
     1.打開車門
     2.插入鑰匙
     3.啓動發送機
     4.掛擋
     5.出發
     6.剎車
     7.歇火停車
    大家可以通過上面實例中看出,這個過程中都是有先後順序的,可以直接定義一個Car類,上面所有的行爲都是按照順序依次調用即可。通常情況車是你自己開,這中行爲都是在Car類中依次執行即可,但是有一天,你朋友借車外出,他這個人比較奇葩,在這個過程中,他需要吃點東西,和朋友打打電話,聽聽音樂。因此你發現,上面類中Car行爲就滿足不了他的需求了,需要添加相對應的行爲。在這個過程中,我們無法捕捉不同的人操作需要都不一樣,但是他們相同(固定)操作:
     1.打開車門
     2.插入鑰匙
     3.啓動發送機
     4.掛擋
     5.出發
     6.剎車
     7.歇火停車
因此我們可以把這些固定操作順序,定義在Car類中,並且提供相對應的行爲同時定義一個供外界自己處理的行爲。因此下面按照這樣來實現
     1.打開車門
     2.插入鑰匙
     3.啓動發送機
     4.掛擋
     5.出發
        5.1處理特定行爲
     6.剎車
     7.歇火停車
然後我們默認實現特定行爲實現(聽歌),其他人繼承Car類,可以複寫特定行爲,還可以增加自己愛好行爲。
因此,通過上面實例,我們可以定義Car類,默認實現上面行爲,提供個性化行爲讓子類繼承實現。
當然我個人不實現上面這個實例,通過演示我們去銀行查賬情況,1.輸入密碼;2.顯示賬戶餘額;3.計算利息

namespace 模板方法_設計模式
{
    class RoutineMehods
    {
        /// <summary>
        /// 校驗用戶
        /// </summary>
        /// <param name="id"></param>
        /// <param name="code"></param>
        /// <param name="password"></param>
        public void Queryt(string id,string code,string password)
        {
            if (!string.IsNullOrEmpty(code))
            {
                int count = this.GetNameCount();
                double lx = GetNameLx(count);
                this.ShowName(code,count,lxDq);
            }
            else
            {
                Console.WriteLine("賬號密碼錯誤");
            }
        }
        /// <summary>
        ///  獲取賬戶餘額
        /// </summary>
        private int GetNameCount()
        {
            Random random = new Random();
            return random.Next(10000,100000);
        }

        /// <summary>
        /// 計算活期利息
        /// </summary>
        /// <param name="count">賬戶餘額</param>
        /// <returns></returns>
        protected double GetNameLx(int count)
        {
            return count * 0.04;
        }

        /// <summary>
        /// 顯示查詢結果
        /// </summary>
        /// <param name="code">賬戶</param>
        /// <param name="count">總金額</param>
        /// <param name="countLx">利息總額</param>
        protected void ShowName(string code,int count,double countLx)
        {
            Console.WriteLine("當前賬戶:{0},賬戶餘額:{1},利息總額:{2}",code,count,countLx);
        }
    }
}

Main方法調用

static void Main(string[] args)
{
    RoutineMehods();
    Console.ReadKey();
}

private static void RoutineMehods()
{
    RoutineMehods routine = new RoutineMehods();
    routine.Queryt("123", "王炸", "7852147");
}

執行結果:

銀行嘛,大家都是知道的,定期推去不同存款方式,假設本次推送活期利息爲0.04,定期利息0.05,那麼我們就需要修改程序

        /// <summary>
        /// 計算利息
        /// </summary>
        /// <param name="count">賬戶餘額</param>
        /// <returns></returns>
        protected double GetNameLxHq(int count,bool isGrad)
        {
            double lv = 0.04;
            if (isGrad)
            {
                lv = 0.05;
            }
            return count * lv;
        }

此時後期有推出理財產品等其他活動。。。。因爲我們使用模板方法設計模式,實現如下:
設計一個銀行類

namespace 模板方法_設計模式
{
    public abstract class AbstractBank
    {
        /// <summary>
        /// 校驗用戶
        /// </summary>
        /// <param name="id"></param>
        /// <param name="code"></param>
        /// <param name="password"></param>
        public void Queryt(string id, string code, string password)
        {
            if (!string.IsNullOrEmpty(code))
            {
                int count = this.GetNameCount();
                double lxDq = this.GetNameLx(count);
                this.ShowName(code, count, lxDq);
            }
        }
        /// <summary>
        ///  獲取賬戶餘額
        /// </summary>
        private int GetNameCount()
        {
            Random random = new Random();
            return random.Next(10000, 100000);
        }

        /// <summary>
        /// 計算利息
        /// </summary>
        /// <param name="count">賬戶餘額</param>
        /// <returns></returns>
        protected virtual double GetNameLx(int count)
        {
            return count * 0.04;
        }

        /// <summary>
        /// 顯示查詢結果
        /// </summary>
        /// <param name="code">賬戶</param>
        /// <param name="count">總金額</param>
        /// <param name="countLx">利息總額</param>
        protected virtual void ShowName(string code, int count, double countLx)
        {
            Console.WriteLine("當前賬戶:{0},賬戶餘額:{1},利息總額:{2}", code, count, countLx);
        }
    }
}

定期產品類:包含格式化產品理財

namespace 模板方法_設計模式
{
    class DingQiClass : AbstractBank
    {
        protected override double GetNameLx(int count)
        {
            Console.WriteLine("定期查詢成功!");
            return count * 0.05;
        }
        protected override void ShowName(string code, int count, double countLx)
        {
            base.ShowName(code, count, countLx);
            Console.WriteLine("理財收益高,投資需謹慎");
        }
    }
}

Main方法

       static void Main(string[] args)
        {
            TempleMehods();
            Console.ReadKey();
        }

        private static void TempleMehods()
        {
           AbstractBank abstractBank = new DingQiClass();
            abstractBank.Queryt("456","拖拉機","896325");
        }

運行結果:

活期用戶

       static void Main(string[] args)
        {
            TempleMehods();
            Console.ReadKey();
        }

        private static void TempleMehods()
        {
           AbstractBank abstractBank = new HuoQiClass();
            abstractBank.Queryt("456","拖拉機","896325");
        }

運行結果:

 


       總結:
       通過上面兩個實例,我們不難看出模板方法設計模式,注重的是類和行爲之間的分離,側重於類和方法之間的關係,通過合理使用普通方法\構造方法\虛方法,使我們程序邏輯解耦,代碼重用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章