模板設計模式,是處理程序按照某中順序執行,通過類和行爲分離,來處理的設計模式之一。主要是是關注類和行爲之間的分離。
生活實例,假如今天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");
}
運行結果:
總結:
通過上面兩個實例,我們不難看出模板方法設計模式,注重的是類和行爲之間的分離,側重於類和方法之間的關係,通過合理使用普通方法\構造方法\虛方法,使我們程序邏輯解耦,代碼重用。