在网上看到很多关于设计模式的文章。但是基本都是单独讲解某一个设计模式的应用场景和设计思路。可是真实的项目中,可能仅仅只按照书上的某种设计模式就能写出优雅的代码吗?我觉得是不可能的。我这篇文章希望跟大家分享的是我思考的过程,而非结果。首先,应该对书上的20多种的设计模式有了解,大概清楚它们都是怎么样一个设计思路。建议有想学习设计模式的Friends还是买本纸质书系统的学习。下面,我给出一个真实的项目来引出我对这个项目的思考。第一次写博客分享我的思路,在加上我的思维有些女性思维,是跳跃性的。可能有些表达不是很清楚。望大家见谅。
/// <summary> /// 处理流程基类 /// </summary> public abstract class PRocessFlowBase : iprocessFlow { protected ProcessFlowBase(ProcessFlowBase processFlowWhenRight = default(ProcessFlowBase), ProcessFlowBase processFlowWhenWrong = default(ProcessFlowBase)) { this.NextProcessFlowWhenRight = processFlowWhenRight; this.NextProcessFlowWhenWrong = processFlowWhenWrong; this.IsRight = true; this.IsEnd = false; } protected IDbConnection DbConnection { get; set; } protected IDbCommand DbCommand { get; set; } protected IDbTransaction DbTransaction { private get; set; } /// <summary> /// 当前流程是否处理通过 /// </summary> private bool IsRight { get; set; } /// <summary> /// 流程是否结束 /// </summary> private bool IsEnd { get; set; } /// <summary> /// 下一个流程,当流程处理操作通过的时候 /// </summary> private ProcessFlowBase NextProcessFlowWhenRight { set; get; } /// <summary> /// 下一个流程,当流程处理操作不通过的时候 /// </summary> private ProcessFlowBase NextProcessFlowWhenWrong { get; set; } /// <summary> /// 处理 /// </summary> /// <param name="dataContext"></param> public void Process(DataContext dataContext) { this.ProcessTemplate(dataContext); this.RecordLog(dataContext); if (this.IsEnd) return; if (this.IsRight) { if (this.NextProcessFlowWhenRight == default(ProcessFlowBase)) return; this.NextProcessFlowWhenRight.SetParameters(this.DbConnection, this.DbCommand, this.DbTransaction); this.NextProcessFlowWhenRight.Process(dataContext); } else { if (this.NextProcessFlowWhenWrong == default(ProcessFlowBase)) return; this.NextProcessFlowWhenWrong.SetParameters(this.DbConnection, this.DbCommand, this.DbTransaction); this.NextProcessFlowWhenWrong.Process(dataContext); } } /// <summary> /// 流程处理模板方法,供子类实现 /// </summary> /// <param name="dataContext"></param> protected abstract void ProcessTemplate(DataContext dataContext); /// <summary> /// 记录日志,供子类实现 /// </summary> /// <param name="dataContext"></param> protected virtual void RecordLog(DataContext dataContext) { LogHelper.Record(dataContext); } /// <summary> /// 结束本次流程 /// </summary> protected void EndProcessFlow() { this.IsEnd = true; } /// <summary> /// 确定下一流程,后续候选流程名单在调用构造函数的时候已经初始化好 /// </summary> /// <param name="rightFlowOrWrongFlow"></param> protected void SetNextFlow(RightFlowOrWrongFlow rightFlowOrWrongFlow) { this.IsRight = rightFlowOrWrongFlow == RightFlowOrWrongFlow.Right; } /// <summary> /// 回滚操作流程 /// </summary> protected void RollBackProcessFlow() { this.DbTransaction.Rollback(); this.DbConnection.Close(); } /// <summary> /// 提交事物操作 /// </summary> protected void CommitProcessFlow() { this.DbTransaction.Commit(); this.DbConnection.Close(); } /// <summary> /// 设置下一流程单例属性 /// </summary> /// <param name="param"></param> private void SetParameters(params object[] param) { var dbConnection = param[0] as IDbConnection; var dbCommand = param[1] as IDbCommand; var dbTransaction = param[2] as IDbTransaction; this.DbConnection = dbConnection; this.DbCommand = dbCommand; this.DbTransaction = dbTransaction; } }
/// <summary> /// 检验授权码流程,此流程应当作为所有业务流程的入口流程。会在此类中做一些特别的处理 /// </summary> public class CheckToken : ProcessFlowBase { public CheckToken(ProcessFlowBase processFlowWhenRight = default(ProcessFlowBase), ProcessFlowBase processFlowWhenWrong = default(ProcessFlowBase)) : base(processFlowWhenRight, processFlowWhenWrong) { //这个流程作为所有业务处理的入口流程,所以,我在这里要写入一段初始化流程事务对象的代码,仅执行一次 base.DbConnection = LogHelper.CreateDbConnection(); base.DbConnection.Open(); base.DbCommand = base.DbConnectio
新闻热点
疑难解答