设计模式-模板方法设计模式
面向对象,万物皆对象,用一个雷来反应现实生活中的东西。
比如银行系统,业务升级---活期/定期,差别很小,就加判断(违背单一职责)。差别比较多,尤其是类比较复杂,类型拆分下。拆分之后,自然就有父类,代码重用。
利率:每个客户端都有利率,但是各不一样-----抽象方法。
Show():不分客户端是一样的,个别客户端是不一样的------虚方法。
有个复杂的多步骤的业务,定义一个父类(模板),模板负责完成流程,把步骤分解,固定不变的当前类(父类)----各不相同的子类,有的相同,有的不同的,用虚方法。
好处:可以扩展,职责分明。
/// <summary> /// 银行客户端 /// </summary> public abstract class AbstractClient { public void Query(int id, string name, string password) { if (this.CheckUser(id, password)) { double balance = this.QueryBalance(id); double interest = this.CalculateInterest(balance); this.Show(name, balance, interest); } else { Console.WriteLine("账户密码错误"); } } public bool CheckUser(int id, string password) { return DateTime.Now < DateTime.Now.AddDays(1); } public double QueryBalance(int id) { return new Random().Next(10000, 1000000); } /// <summary> /// 活期 定期 利率不同 /// </summary> /// <param name="balance"></param> /// <returns></returns> public abstract double CalculateInterest(double balance); public virtual void Show(string name, double balance, double interest) { Console.WriteLine("尊敬的{0}客户,你的账户余额为:{1},利息为{2}", name, balance, interest); } //private void Show(string name, double balance, double interest) //{ // Console.WriteLine("尊贵的{0} vip客户,您的账户余额为:{1},利息为{2}", // name, balance, interest); //} }
/// <summary> /// 银行客户端 /// </summary> public class Client { public void Query(int id, string name, string password) { if (this.CheckUser(id, password)) { double balance = this.QueryBalance(id); double interest = this.CalculateInterest(balance); this.Show(name, balance, interest); } else { Console.WriteLine("账户密码错误"); } } public bool CheckUser(int id, string password) { if (true) { } else { } return DateTime.Now < DateTime.Now.AddDays(1); } public double QueryBalance(int id) { if (true) { } else { } return new Random().Next(10000, 1000000); } public double CalculateInterest(double balance) { if (true) { } else { } return balance * 0.005; } public void Show(string name, double balance, double interest) { Console.WriteLine("尊敬的{0}客户,你的账户余额为:{1},利息为{2}", name, balance, interest); } }
/// <summary> /// 银行客户端 /// </summary> public class ClientCurrent : AbstractClient { /// <summary> /// 活期 定期 利率不同 /// </summary> /// <param name="balance"></param> /// <returns></returns> public override double CalculateInterest(double balance) { return balance * 0.001; } }
/// <summary> /// 银行客户端 /// </summary> public class ClientRegular : AbstractClient { /// <summary> /// 活期 定期 利率不同 /// </summary> /// <param name="balance"></param> /// <returns></returns> public override double CalculateInterest(double balance) { return balance * 0.003; } }
/// <summary> /// 银行客户端 /// </summary> public class ClientVip : AbstractClient { /// <summary> /// 活期 定期 利率不同 /// </summary> /// <param name="balance"></param> /// <returns></returns> public override double CalculateInterest(double balance) { return balance * 0.005; } public override void Show(string name, double balance, double interest) { Console.WriteLine("尊贵的{0} vip客户,您的账户余额为:{1},利息为{2}", name, balance, interest); } }
{ AbstractClient client = new ClientCurrent(); client.Query(387, "冰乐", "123456"); } { AbstractClient client = new ClientRegular(); client.Query(448, "冰乐", "000000"); } { AbstractClient client = new ClientVip(); client.Query(259, "冰乐", "251146"); }
模板方法设计模式,好像就只是抽象类+子类。