行为型模式-模板方法模式
定义一个操作框架,将一些具体的步骤延迟到子类中实现。使子类可以在不改变算法的结构上可以重定义改算法的某些特定步骤。
封装不变的部分,扩展可变部分,把不便的部分封装到父类中实现,可变的部分通过继承在子类中实现。
模板方法角色:
AbstractClass定义一个模板,其子类将重定义PrimitiveOperation1和PrimitiveOperation2操作
ConcreteClass:实现PrimitiveOperation1和PrimitiveOperation2以完成算法中与特定子类(Client)相关的内容。
在模板方法模式中,AbstractClass中的TemplateMethod提供了一个标准模板,该模板包含PrimitiveOperation1和PrimitiveOperation2两个方法,这两个方法的内容Client可以根据自己的需要重写。
结构图:
namespace Libraries.Test.DesignPattern.TemplateMethod
{
/// <summary>
/// 快递接口查询
/// </summary>
public abstract class Express
{
/// <summary>
/// 验证快递公司和快递单号
/// </summary>
/// <param name="postCompany"></param>
/// <param name="postNo"></param>
/// <returns></returns>
private bool Validate(string postCompany, string postNo)
{
bool result = false;
result = true;
return result;
}
/// <summary>
/// 模板方法
/// </summary>
/// <param name="postCompany"></param>
/// <param name="postNo"></param>
/// <returns></returns>
public string Excute(string postCompany, string postNo)
{
string str = "";
bool result = Validate(postCompany, postNo);
if (!result)
{
str = "快递公司或快递单号不符合规则";
return str;
}
//模板方法执行操作
str = Realization(postCompany, postNo);
return str;
}
protected abstract string Realization(string postCompany, string postNo);
}
}
namespace Libraries.Test.DesignPattern.TemplateMethod
{
public class Kuaidi100 : Express
{
protected override string Realization(string postCompany, string postNo)
{
return "通过Kuaidi100来查询快递信息:" + postCompany + "," + postNo;
}
}
}
namespace Libraries.Test.DesignPattern.TemplateMethod
{
public class Kdniao : Express
{
protected override string Realization(string postCompany, string postNo)
{
return "通过Kdniao来查询快递信息:" + postCompany + "," + postNo;
}
}
}
namespace Libraries.Test.DesignPattern.TemplateMethod
{
public class Client
{
public void Excute()
{
//Kdniao查询
Express kdniao = new Kdniao();
string kdniaoStr = kdniao.Excute("圆通", "12542154125");
//Kuaidi100查询
Express kuaid100 = new Kuaidi100();
string kuaid100Str = kuaid100.Excute("韵达", "1254215421");
}
}
}
还没有评论,来说两句吧...