版权声明:本文为Banana原创文章,未经Banana允许不得转载。评论请留下你认真观看后的想法或者意见,非常感谢! https://blog.csdn.net/qq1515312832/article/details/79365527
前言
总感觉我的责任链模式+策略模式完成的下机跟别人不一样,不过要说哪里不一样也还真的说不出来,但是我觉得我这样用着也还不错,代码思路也足够清晰,然后我就跟大家介绍一下吧。
没用设计模式的时候
我使用了存储过程来实现的下机,同时会更新三个表,所以存储过程更加方便
没有加设计模式的时候代码轰轰烈烈这么一大段,加了设计模式之后就把算钱的一部分全部都去掉了
public IList<CardModel.Lines> OffLine(string cardno)
{
string sql = "select * from Online_Info where CardNo = '" + cardno + "'";
DataTable dt = sqlhelper.ExecuteQuery(sql, CommandType.Text);
IList<CardModel.Lines> line = ConvertHelper<CardModel.Lines>.ConvertToModel(dt);
DateTime datetime = sqlhelper.GetTimeFromSQL();
line[0].Offdate = datetime.ToShortDateString().ToString();
line[0].Offtime = datetime.ToShortTimeString().ToString();
//获取余额
string cashsql = "select * from view_stucard where CardNo = '" + cardno + "'";
DataTable cashdt = sqlhelper.ExecuteQuery(cashsql, CommandType.Text);
IList<CardModel.StuCard> stucard = ConvertHelper<CardModel.StuCard>.ConvertToModel(cashdt);
double oldCash = Convert.ToDouble(stucard[0].Cash);
//-----------------------我是算钱的代码--------------------------------------------
#region 算钱
string sqlbasicdata = "select * from BasicData_info where serial = (select max(Serial) from BasicData_info)";//找到编号最大(也就是最新的)的记录
DataTable basicdatadt = sqlhelper.ExecuteQuery(sqlbasicdata, CommandType.Text);
IList<BasicDataModel.BasicData> bd = LoginDAL.ConvertHelper<BasicDataModel.BasicData>.ConvertToModel(basicdatadt);
#region spendtime:花费时长
DateTime ondatetime = Convert.ToDateTime(line[0].OnDate.Split(' ')[0] + " " + line[0].OnTime);
DateTime offdatetime = datetime;
double SpendTime = (offdatetime - ondatetime).TotalHours;
#endregion
//花费时间
double CostTime = SpendTime;
//递增单位时间
double PerTime = Convert.ToDouble(bd[0].UnitTime) / 60;
//单位时长的钱
int PerMoney = (line[0].CardType == "一般用户") ? Convert.ToInt32(bd[0].Rate) : Convert.ToInt32(bd[0].TmpRate);
//准备时间
double MinTime = Convert.ToDouble(bd[0].PrepareTime) / 60;
//花费金额
int Cost = 0;
if (SpendTime > MinTime)
{
while (SpendTime > 0)
{
SpendTime -= PerTime;
Cost += PerMoney;
}
}
#endregion
//--------------------------我算完钱了-----------------------------------------
double newCash = oldCash - Convert.ToDouble(line[0].Consume);
line[0].Consume = Cost.ToString();
line[0].ConsumeTime = CostTime.ToString();
line[0].Cash = newCash.ToString();
line[0].Status = "正常下机";
SqlParameter[] sqlparas = {//将存储过程中的名字与程序中的名字对应起来
new SqlParameter("@CardNo",line[0].CardNo),
new SqlParameter("@StuNo",line[0].StuNo),
new SqlParameter("@Date",line[0].Date),
new SqlParameter("@Type",line[0].CardType),
new SqlParameter("@StuName",line[0].StuName),
new SqlParameter("@Sex",line[0].Sex),
new SqlParameter("@Department",line[0].Department),
new SqlParameter("@OnDate",line[0].OnDate),
new SqlParameter("@OnTime",line[0].OnTime),
new SqlParameter("@Cash",line[0].Cash),
new SqlParameter("@Computer",line[0].Computer),
new SqlParameter("@Offdate",line[0].Offdate),
new SqlParameter("@Offtime",line[0].Offtime),
new SqlParameter("@ConsumeTime",line[0].ConsumeTime),
new SqlParameter("@Consume",line[0].Consume),
new SqlParameter("@Status",line[0].Status)
};
string procname = "proc_OffLine";
sqlhelper.ExecuteNonQuery(procname, sqlparas, CommandType.StoredProcedure);
return line;
}
加上设计模式
有变化的代码只有这一小段,就不再贴一遍代码了
//-------------------------------------------------------------------
//这里面的是算钱的代码,全都不要了
//-------------------------------------------------------------------
LoginDAL.算钱策略模式.CostOperation costOperater = new 算钱策略模式.CostOperation(stucard[0].Type);
line = costOperater.ICalculateCost(stucard, line);
double newCash = oldCash - Convert.ToDouble(line[0].Consume);
//line[0].Consume = Cost.ToString();
//line[0].ConsumeTime = CostTime.ToString();
line[0].Cash = newCash.ToString();
line[0].Status = "正常下机";
策略模式的应用
public class CostOperation
{
ICostStragety stragety = null;
public CostOperation(string type)
{
switch (type)
{
case "一般用户":
stragety = new LoginDAL.算钱策略模式.FixedUserStragety();
break;
case "固定用户":
stragety = new LoginDAL.算钱策略模式.TempUserStragety();
break;
}
}
public IList<CardModel.Lines> ICalculateCost(IList<CardModel.StuCard> stucard, IList<CardModel.Lines> line)
{
return stragety.CalculateCost(stucard, line);
}
接口的实现
public interface ICostStragety
{
IList<CardModel.Lines> CalculateCost(IList<CardModel.StuCard> stucard, IList<CardModel.Lines> line);
}
子策略
class FixedUserStragety : ICostStragety
{
public IList<CardModel.Lines> CalculateCost(IList<CardModel.StuCard> stucard, IList<CardModel.Lines> line)
{
SqlHelper sqlhelper = new SqlHelper();
string sqlbasicdata = "select * from BasicData_info where serial = (select max(Serial) from BasicData_info)";//找到编号最大(也就是最新的)的记录
DataTable basicdatadt = sqlhelper.ExecuteQuery(sqlbasicdata, CommandType.Text);
IList<BasicDataModel.BasicData> bd = LoginDAL.ConvertHelper<BasicDataModel.BasicData>.ConvertToModel(basicdatadt);
Responsibility.Manager timeManager = new Responsibility.TimeManager();
Responsibility.Manager moneyManager = new Responsibility.MoneyManager();
//设置责任链上级
timeManager.SetSuperior(moneyManager);
timeManager.RequestApplications(line, bd);
return line;
}
}
责任链模式的应用
namespace LoginDAL.Responsibility
{
public abstract class Manager
{
protected Manager superior;
public void SetSuperior(Manager superior)
{
this.superior = superior;
}
public abstract void RequestApplications(IList<CardModel.Lines> line, IList<BasicDataModel.BasicData> bd);
}
public class TimeManager : Manager
{
public override void RequestApplications(IList<CardModel.Lines> line, IList<BasicDataModel.BasicData> bd)
{
DateTime ondatetime = Convert.ToDateTime(line[0].OnDate.Split(' ')[0] + " " + line[0].OnTime);
DateTime offdatetime = Convert.ToDateTime(line[0].Offdate + " " + line[0].Offtime);
double SpendTime = (offdatetime - ondatetime).TotalHours;
line[0].ConsumeTime = SpendTime.ToString("#0.0");
superior.RequestApplications(line, bd);
}
}
public class MoneyManager : Manager
{
public override void RequestApplications(IList<CardModel.Lines> line, IList<BasicDataModel.BasicData> bd)
{
//单位增长时间
double PerTime = Convert.ToDouble(bd[0].UnitTime) / 60;
//单位时长的钱
int PerMoney = Convert.ToInt32(bd[0].Rate);
//准备时间
double MinTime = Convert.ToDouble(bd[0].PrepareTime) / 60;
//花费金额
int Cost = 0;
double SpendTime = Convert.ToDouble(line[0].ConsumeTime);
if (SpendTime > MinTime)
{
while (SpendTime > 0)
{
SpendTime -= PerTime;
Cost += PerMoney;
}
}
line[0].Consume = Cost.ToString();
}
}
}
总结
我总觉得我的策略模式是简单工厂和策咯模式的结合,越看越像,不过还是有那么一点点凌乱。
最重要的一点是,自己可以切切实实的体会到,代码的拓展性、可重用性、维护性得到了质的提高。即使我的应用是错误的,这种思想也值得我们每个人去学习、去深思!!
ps:自我感觉注释做的很不到位...