职责链+策略模式+外观实现用户下机
上篇博客介绍了职责链模式加外观模式来实现下机计算下机时间,这篇博客主要介绍如何利用策略模式来实现计算用户的消费金额。首先来重温一下策略模式:
策略模式:定义了算法族,并分别封装起来,让它们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。我们利用策略模式,正是因为有不同的用户,而且他们的算钱方式之间相互么有影响!
先看一下类图,一张图胜过千言万语。
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#实现肯定很难,不过经过这几天的奋斗之后发现所有的困难都是自己想象出来的,只要去做就可以做到。