一、引言
说到模板,顾名思义:就是样板,整体架构已经有了,你只需要填充自己的特定内容就可以了。如:简历模板,论文模板,PPT模板等
在软件设计中,模板方法模式与之很相似,下面请看我们今天要学习的模板方法模式
二、模板方法模式
定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
下面结构图:
抽象模板角色(AbstractClass):在抽象类中定义一个或多个基本操作,每一个操作对应算法中一个步骤;同时提供一个模板方法用户定义基本方法的操作次序,而通过子类覆写某些步骤,从而使得相同的算法框架可以有不同的执行结果
具体模板角色(Concrete):实现父类中声明的抽象基本操作以完成子类特定算法的步骤
场景:公司要为银行做一个利息计算系统,流程首先验证用户登录是否正确,如果登录失败提示错误信息,然后如果登录成功,根据用户不同类型使用不同计算公式计算利息,最后展示利息计算结果
下面该业务场景demo:
abstract class Account { //基本方法-具体方法 public bool validate(string uid,string password) { Console.WriteLine($"uid is {uid},pwd is {password}"); if(uid.Equals("michael")&&password.Equals("123456")) { return true; } else { return false; } } //基本方法-抽象方法 public abstract void Calculate(); //基本方法-具体方法 public void Display() { Console.WriteLine("显示利息"); } //模板方法 public void Handle(string uid, string password) { if(!validate(uid, password)) { Console.WriteLine("您输入的账号密码有误"); return; } Calculate(); Display(); } class CurrentAccount : Account { //覆写父类抽象的基本方法 public override void Calculate() { Console.WriteLine("请使用活期利率计算利息"); } } class RegularAccount : Account { public override void Calculate() { Console.WriteLine("请使用定期利率计算利息"); } } static void Main(string[] args) { string type= ConfigurationManager.AppSettings["account"]; object obj= Assembly.Load("TemplateMethodPattern").CreateInstance(type); (obj as Account).Handle("michael", "123456"); Console.Read(); } //xml配置项 <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <appSettings> <add key="account" value="TemplateMethodPattern.CurrentAccount"/> </appSettings> </configuration>
分析:该业务场景中不管定期还是活期,检查用户登录和展示算法结果都是相同的,所以可以把相同部分抽象出来到抽象类中去定义,具体不同部分可以到具体的子类中去实现。尽可能的把相同部分抽象到了上端,也很好的符合了开闭原则。
优点:
1.提高了代码复用性
2.能灵活应对子步骤的变化,符合开放-封闭原则
缺点:
1.需要为每一个基本方法的不同实现提供一个子类,如果抽象模板类中可变基本方法很多,导致子类庞大,系统复杂度提高
使用场景:
1.将一些复杂的算法进行分割,将算法中固定的方法设计为模板方法和父类具体方法,将一些可以改变的细节交予子类中实现;
2..如:NET开发自定控件,我们只需要覆写控件中的部分方法
行为型设计模式之模板方法的学习就到此结束了,希望能够帮到你,若有不足,欢迎斧正,感谢您的阅读。