上篇博客介绍了职责链模式加外观模式来实现下机计算下机时间,这篇博客主要介绍如何利用策略模式来实现计算用户的消费金额。首先来重温一下策略模式:
策略模式:定义了算法族,并分别封装起来,让它们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。我们利用策略模式,正是因为有不同的用户,而且他们的算钱方式之间相互么有影响!
先看一下类图,一张图胜过千言万语。
CashStrategy:抽象的算法类
public abstract class CashStrategy
{
#region 下机算钱抽象类 abstract decimal GetConsumeMoney(int ConsumeTime)
/// <summary>
/// #region 下机算钱抽象类
/// </summary>
/// <param name="ConsumeTime"></param>
/// <returns></returns>
public abstract decimal GetConsumeMoney(int ConsumeTime);
#endregion
}
CashTemporary:临时用户策略
public class CashTemporary : CashStrategy
{
#region 具体策略类,封装一般用户的收费算法 override decimal GetConsumeMoney(int ConsumeTime)
/// <summary>
/// 具体策略类,封装一般用户的收费算法
/// </summary>
public override decimal GetConsumeMoney(int ConsumeTime)
{
BasicBLL basicbll = new BasicBLL();
BasicDataEntity basicdataEntity = new BasicDataEntity();
List<BasicDataEntity> basicdatalist;
basicdataEntity.UseState = "使用";
//获取临时用户每小时费用
basicdatalist = basicbll.selectBasicData(basicdataEntity);
decimal Temporary = basicdatalist[0].Temporary;
//计算消费金额
decimal ConsumeMoney;
ConsumeMoney = ConsumeTime * (Temporary / 60);
return ConsumeMoney;
}
#endregion
}
CashRegular:固定用户策略
public class CashRegular : CashStrategy
{
#region 具体策略类,封装固定用户下机收费算法 override decimal GetConsumeMoney(int ConsumeTime)
/// <summary>
/// 具体策略类,封装固定用户下机收费算法
/// </summary>
public override decimal GetConsumeMoney(int ConsumeTime)
{
BasicBLL basicbll =new BasicBLL ();
BasicDataEntity basicdataEntity =new BasicDataEntity();
List<BasicDataEntity> basicdatalist;
basicdataEntity.UseState="使用";
//获取固定用户每小时费用
basicdatalist = basicbll.selectBasicData(basicdataEntity);
decimal regular = basicdatalist[0].Regular;
//计算消费金额
decimal ConsumeMoney;
ConsumeMoney = ConsumeTime * (regular / 60);
return ConsumeMoney;
}
#endregion
}
CashContext:上下文,用一个CashStrategy来配置,维护对Strategy对象的引用
/// <summary>
/// Context上下文,用一个CashStrategy来配置,维护一个对Strategy对象的引用
/// </summary>
public class CashContext {
public CashStrategy cashStrategy;
#region 用一个CashStrategy来配置Context上下文 CashContext(string CardType)
/// <summary>
/// 用一个CashStrategy来配置Context上下文
/// </summary>
/// <param name="CardType"></param>
public CashContext(string CardType)
{
switch (CardType)
{
case "固定用户":
cashStrategy = new CashRegular();
break;
case "临时用户":
cashStrategy = new CashTemporary();
break;
default:
CardType = "";
break;
}
}
#endregion
#region 获得上机消费金额 decimal GetResult(int ConsumeTime)
/// <summary>
/// 获得上机消费金额
/// </summary>
/// <param name="ConsumeTime"></param>
/// <returns></returns>
public decimal GetResult(int ConsumeTime)
{
return cashStrategy.GetConsumeMoney(ConsumeTime);
}
#endregion
}
这里利用简单工厂来实现不同的用户调用不同的策略,根据传入参数的实例化不同的策略类,并进行调用计算上机的消费金额。客户端只需要调用一个类CashContext就可以了,可以降低与B的耦合。客户端调用:
//调用策略模式计算消费金额
CashContext cashcontext = new CashContext(cardEntity.CardType);
decimal ConsumeMoney = cashcontext.GetResult(ConsumeTime);
【总结】
这次合作运用设计模式是对之前学习的一个深化,刚开始觉得用C#实现肯定很难,不过经过这几天的奋斗之后发现所有的困难都是自己想象出来的,只要去做就可以做到。