模板设计模式,是处理程序按照某中顺序执行,通过类和行为分离,来处理的设计模式之一。主要是是关注类和行为之间的分离。
生活实例,假如今天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
{
///
/// 校验用户
///
///
///
///
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("账号密码错误");
}
}
///
/// 获取账户余额
///
private int GetNameCount()
{
Random random = new Random();
return random.Next(10000,100000);
}
///
/// 计算活期利息
///
/// 账户余额
///
protected double GetNameLx(int count)
{
return count * 0.04;
}
///
/// 显示查询结果
///
/// 账户
/// 总金额
/// 利息总额
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,那么我们就需要修改程序
///
/// 计算利息
///
/// 账户余额
///
protected double GetNameLxHq(int count,bool isGrad)
{
double lv = 0.04;
if (isGrad)
{
lv = 0.05;
}
return count * lv;
}
此时后期有推出理财产品等其他活动。。。。因为我们使用模板方法设计模式,实现如下:
设计一个银行类
namespace 模板方法_设计模式
{
public abstract class AbstractBank
{
///
/// 校验用户
///
///
///
///
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);
}
}
///
/// 获取账户余额
///
private int GetNameCount()
{
Random random = new Random();
return random.Next(10000, 100000);
}
///
/// 计算利息
///
/// 账户余额
///
protected virtual double GetNameLx(int count)
{
return count * 0.04;
}
///
/// 显示查询结果
///
/// 账户
/// 总金额
/// 利息总额
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");
}
总结:
通过上面两个实例,我们不难看出模板方法设计模式,注重的是类和行为之间的分离,侧重于类和方法之间的关系,通过合理使用普通方法\构造方法\虚方法,使我们程序逻辑解耦,代码重用。