【机房合作】策略+职责链在下机中的应用
一、刚开始使用职责链模式来实现下机时计算消费金额。
1、父类:CountCashManagerBLL
abstract class CountCashManagerBLL{protected string name;//管理者的上机protected CountCashManagerBLL superior;public CountCashManagerBLL(string name){this.name = name;}//设置继任者,即所有计算金额的父类public void SetSuperior(CountCashManagerBLL superior){this.superior = superior;}//处理请求的抽象方法,即下机时的收费金额public abstract OnOffLineEntity GetCash(OnOffLineEntity offline);}
2、子类:FirstCountCashBLL
//计算第一步时间间隔所花费的金额public class FirstCountCashBLL : CountCashManagerBLL{public FirstCountCashBLL(string name): base(name){ }public override OnOffLineEntity GetCash(OnOffLineEntity offline){ List<BasicDataEntity> List = new List<BasicDataEntity>();List = FactoryRoom.CreateBasicData().InquireBasicData();//如果上机时间 <=准备时间if (int.Parse(offline.consumeTime)<=int.Parse(List[0].readyTime)){offline.consume = 0;}else{//传给下一级superior.GetCash(offline);}return offline;}}
3、子类:SecondCountCashBLL
//计算未达到单位递增时间的消费金额,大于准备时间public class SecondCountCashBLL:CountCashManagerBLL{public override OnOffLineEntity GetCash(OnOffLineEntity offline){CardEntity cardinfo=new CardEntity();List<BasicDataEntity> List=FactoryRoom.CreateBasicData().InquireBasicData();if (int.Parse(offline.consumeTime) < int.Parse(List[0].increaseTime)){if (cardinfo.cardType.Trim()=="VIP用户"){offline.consume = int.Parse(List[0].VIPRate); //VIP用户消费金额}else{offline.consume = int.Parse(List[0].generalRate); //一般用户消费金额}}else{superior.GetCash(offline);}return offline;}}
4、子类:ThirdCountCashBLL
//计算已经达到单位上机时间的消费金额public class ThirdCountCashBLL:CountCashManagerBLL{public override OnOffLineEntity GetCash(OnOffLineEntity offline){List<BasicDataEntity> List = FactoryRoom.CreateBasicData().InquireBasicData();double consumeTime= Convert.ToDouble(offline.consumeTime); //消费时间(将string类型转换为double类型)double increaseTime = Convert.ToDouble(List[0].increaseTime);//单位递增时间 int VIPRate=int.Parse(List[0].VIPRate); //每单位时间VIP费用int generalRate=int.Parse(List[0].generalRate); //每单位时间一般用户费用double choseint = Math.Ceiling(consumeTime / increaseTime); //取整(向上取整。如54除以5 等于 6)OnOffLineEntity cardinfo = new OnOffLineEntity();if (cardinfo.cardType.Trim()=="VIP用户"){offline.consume = Convert.ToDecimal(VIPRate * choseint); //将double类型转换为decimal }else //如果是一般用户{offline.consume = Convert.ToDecimal(generalRate * choseint); }return offline;} }
感觉职责链虽然在一定程度上解耦了,但还是不够,于是加上了策略模式。职责链:负责算出有多少个单位时间。策略模式:对一般用户和VIP用户进行分情况讨论。代码如下。
职责链:
FirstCountCashBLl
//计算第一步时间间隔所花费的时间public class FirstCountCashBLL : CountCashManagerBLL{public override OnOffLineEntity GetCash(OnOffLineEntity offline){ List<BasicDataEntity> List = new List<BasicDataEntity>();List = FactoryRoom.CreateBasicData().InquireBasicData();double consumeTime = Convert.ToDouble(offline.consumeTime); //消费时间(将string类型转换为double类型//如果上机时间 <=准备时间if (consumeTime <= int.Parse(List[0].readyTime)){consumeTime = 0;offline.consumeTime = consumeTime.ToString();offline.choseint = 0;}else{//传给下一级superior.GetCash(offline);}return offline;}}
SecondCountCashBLL:
//计算未达到单位递增时间的消费金额,大于准备时间public class SecondCountCashBLL:CountCashManagerBLL{public override OnOffLineEntity GetCash(OnOffLineEntity offline){CardEntity cardinfo=new CardEntity();List<BasicDataEntity> List=FactoryRoom.CreateBasicData().InquireBasicData();double consumeTime = Convert.ToDouble(offline.consumeTime);double increaseTime = Convert.ToDouble(List[0].increaseTime);if (consumeTime < increaseTime){ consumeTime = increaseTime;offline.consumeTime = consumeTime.ToString();offline.choseint = 1;}else{superior.GetCash(offline);}return offline;}} //计算未达到单位递增时间的消费金额,大于准备时间public class SecondCountCashBLL:CountCashManagerBLL{public override OnOffLineEntity GetCash(OnOffLineEntity offline){CardEntity cardinfo=new CardEntity();List<BasicDataEntity> List=FactoryRoom.CreateBasicData().InquireBasicData();double consumeTime = Convert.ToDouble(offline.consumeTime);double increaseTime = Convert.ToDouble(List[0].increaseTime);if (consumeTime < increaseTime){ consumeTime = increaseTime;offline.consumeTime = consumeTime.ToString();offline.choseint = 1;}else{superior.GetCash(offline);}return offline;}}
ThirdCountCashBLL:
public class ThirdCountCashBLL:CountCashManagerBLL{public override OnOffLineEntity GetCash(OnOffLineEntity offline){List<BasicDataEntity> List = FactoryRoom.CreateBasicData().InquireBasicData();double consumeTime= Convert.ToDouble(offline.consumeTime); //消费时间(将string类型转换为double类型)double increaseTime = Convert.ToDouble(List[0].increaseTime);//单位递增时间 int VIPRate=int.Parse(List[0].VIPRate); //每单位时间VIP费用int generalRate=int.Parse(List[0].generalRate); //每单位时间一般用户费用double choseint = Math.Ceiling(consumeTime / increaseTime); //(有多少个单位消费时间)取整(向上取整。如54除以10 等于 6)offline.choseint=choseint;return offline;} }
策略模式:
CashSuperBLL:
public abstract class CashSuperBLL{public FirstCountCashBLL Bfirst = new FirstCountCashBLL();public SecondCountCashBLL Bsecond = new SecondCountCashBLL();public ThirdCountCashBLL Bthird = new ThirdCountCashBLL();public abstract OnOffLineEntity acceptCash(OnOffLineEntity offline);}
CashContextBLL:
public class CashContextBLL{CashSuperBLL cs = null;public CashContextBLL(OnOffLineEntity offline){switch (offline.cardType){case "一般用户":cs = new GeneralCashBLL();break;case "VIP用户":cs = new VIPCashBLL();break;}}//最后外观层只需要调用这个方法就行。public OnOffLineEntity getConsumeCash(OnOffLineEntity offline){return cs.acceptCash(offline);}}
GeneralCashBLL:
public class GeneralCashBLL:CashSuperBLL{public override OnOffLineEntity acceptCash(OnOffLineEntity offline){offline = Bfirst.GetCash(offline);Bfirst.SetSuperior(Bsecond);Bsecond.SetSuperior(Bthird);List<BasicDataEntity> List = FactoryRoom.CreateBasicData().InquireBasicData();int generalRate = int.Parse(List[0].generalRate); //每单位时间一般用户费用offline.consume = Convert.ToDecimal(generalRate * offline.choseint);return offline;}}
VIPCashBLL:
public class VIPCashBLL:CashSuperBLL{public override OnOffLineEntity acceptCash(Entity.OnOffLineEntity offline){List<BasicDataEntity> List = FactoryRoom.CreateBasicData().InquireBasicData();int VIPRate = int.Parse(List[0].VIPRate); //每单位时间VIP费用offline.consume = Convert.ToDecimal(VIPRate * offline.choseint);return offline;}}
【机房合作】策略+职责链在下机中的应用相关推荐
- java 职责链模式_Java中的责任链模式
java 职责链模式 当应有几个处理器来执行某项操作并为这些处理器定义特定顺序时,就需要采用责任链设计模式. 在运行时处理器顺序的可变性也很重要.模式的UML表示如下: 处理程序定义处理器对象的一般结 ...
- 十八、职责链模式-推卸责任,不关我的事,我不管!#和设计模式一起旅行#
不在其位,不谋其政! –出自<论语·泰伯> 故事背景 在现实世界中,有很多情况下会遇到一些推卸责任的场景,比如要办理一件事的时候,被告诉你要去做个做这个事情,但是去了这个地方,确告诉要到另 ...
- 请求的链式处理——职责链模式
本文转载自 :http://blog.csdn.net/lovelion/article/details/7420891 "一对二","过","过&q ...
- 职责链模式应用——下机(机房重构知识点总结)
下机涉及两个方面,消费时间和消费金额. 对消费时间的处理用的是职责链模式,感觉这个模式用的非常妙,參考的师哥的博客:<机房收费下机中用到的策略与职责链解析>:消费金额的处理用策略模式.针对 ...
- 策略模式和职责链模式在CMS中的应用
最近在做一个轻量级CMS供客户站点使用. 根据客户的需求,需要以静态页方式提供用户浏览的页面,同时还要保留一个本份,支持"双远程"发布,即在一台远程发布服务器上保留存根,最终页面保 ...
- 【机房重构个人版】上下机与职责链
刚开始做上下机的时候,感觉上机还可以,下机好麻烦,涉及到各种计算~~~都说万事开头难,那就硬着头皮干吧. 首先应该缕缕上下机的思路.如下图所示: 个人感觉下机的难点有两个:一是职责链模式的使用,二是计 ...
- Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)
Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...
- 观察者模式与职责链模式的相同和不同_GOF设计模式(策略模式,职责链模式)...
策略模式(整体的替换算法) 基本介绍:对象具备某个行为,但是在不同的场景中,该行为有不同的实现算法.(定义一组算法,将每个算法都封装起来,并且使他们之间可以互换).多用于封装算法 类图 角色: 上下文 ...
- 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)
一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...
最新文章
- oracle adg的特点是什么,Oracle12c ADG新特性
- (旧)走遍美国——(三、文化1)
- 双y轴设置 颜色_项目实战:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、实时下位机数据)...
- 《推荐系统笔记(八)》GBDT和XgBoost的原理(内含详细数学推导)
- Java开发笔记(一百四十四)实现FXML对应的控制器
- 快速稳定下载googledrive文件
- android webview权限申请_android WebView全面总结
- Abaqus动力学分析基础
- Class 2 搭建简历网站
- ps界面为啥突然变大了_PS教程丨皮肤美白修饰
- 浏览器被劫持打开变成hao123 和 vs CODE编译器无法打开浏览器问题
- 计算机老师开学第一堂课,开学第一堂课作文(精选8篇)
- 高新技术企业认定申请通过后补贴
- 东南大学信息科学工程学院在计算机,【东南大学计算机科学与工程学院】疑问咨询贴...
- 第004篇:ArcGIS中制作一张图中有多个图框(一幅多图)的方法
- 如何用iDesktop快速制作一幅研究区概况图
- 华硕RT-N13U B1路由器OpenWrt固件操作备忘录(一)--初始篇
- html常用标签大全--附使用方法
- 小心你家的WiFi,别被隔壁老王偷窥了......
- 前端新玩具——webGL简介