您的位置:首页 > 其它

设计模式-行为设计模式:模板方法设计模式 TemplateMethod

2016-12-13 15:18 691 查看
模板方法设计模式在有一套固定流程的时候可以用

优点:代码重用 方便扩展

缺点:解决不了代码爆炸问题

应用到新知识点:钩子方法

钩子方法:通过子类的一个重载方法可以控制父类的方法叫钩子方法

下面例子代码中,有一个展示存款数据父类,然后有 定期类、活期类、绝密类3种子类,其中因为大部分功能都一样,所以直接写在父类里面,并且通过一个抽象方法(计算利息)来实现不同类型存款按不同比例计算利息,并且通过一个virtual虚方法,来实现钩子方法(子类对父类的控制)

父类

public abstract class BaseDeposit
{
public void GetXx(string username,string pwd)
{
if (checkuser(username, pwd))
{
if (checkQx(username))
{
double total = GetTotal(username);
double interest = GetInterest(total);
show(username, total, interest);
}
else
{
Console.WriteLine("无权限查询");
}
}
else
{
Console.WriteLine("用户不存在");
}
}

//展示账户信息
public void show(string username, double total, double interest)
{
Console.WriteLine("账号名:{0},账户余额{1}元,将获得利息{2}元",username,total,interest);
}

//计算利息
public abstract double GetInterest(double total);

//获得账户余额
public double GetTotal(string username)
{
return 50000;
}

//检查是否有权限查询账户信息的虚方法
public virtual bool checkQx(string username)
{
return true;
}

// 检查用户名密码
public bool checkuser(string username, string pwd)
{
return username == "张三" && pwd == "123456";
}

}

定期类:
public class DingQi:BaseDeposit
{
public override double GetInterest(double total)
{
return total * 0.002;
}
}

活期类:
public class HuoQi:BaseDeposit
{
public override double GetInterest(double total)
{
return total * 0.001;
}
}

绝密类:(此类中 重写了 虚方法 实现了钩子方法对父类的控制)
public class JueMi:BaseDeposit
{

public override double GetInterest(double total)
{
return total * 1;//计算也没用 不展示
}

public override bool checkQx(string username)
{
return false;
}
}

调用

Console.WriteLine("*****************下面展示的是定期账户*******************");
BaseDeposit dingqi = new DingQi();
dingqi.GetXx("张三","123456");
Console.WriteLine("*****************下面展示的是活期账户*******************");
BaseDeposit huoqi = new HuoQi();
huoqi.GetXx("张三", "123456");
Console.WriteLine("*****************下面展示的是绝密账户*******************");
BaseDeposit juemi = new JueMi();
juemi.GetXx("张三", "123456");

结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: