国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

優(yōu)雅就一個(gè)字——設(shè)計(jì)模式之?dāng)?shù)據(jù)上傳接口

2019-11-17 03:14:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

優(yōu)雅就一個(gè)字——設(shè)計(jì)模式之?dāng)?shù)據(jù)上傳接口

在網(wǎng)上看到很多關(guān)于設(shè)計(jì)模式的文章。但是基本都是單獨(dú)講解某一個(gè)設(shè)計(jì)模式的應(yīng)用場(chǎng)景和設(shè)計(jì)思路。可是真實(shí)的項(xiàng)目中,可能僅僅只按照書上的某種設(shè)計(jì)模式就能寫出優(yōu)雅的代碼嗎?我覺(jué)得是不可能的。我這篇文章希望跟大家分享的是我思考的過(guò)程,而非結(jié)果。首先,應(yīng)該對(duì)書上的20多種的設(shè)計(jì)模式有了解,大概清楚它們都是怎么樣一個(gè)設(shè)計(jì)思路。建議有想學(xué)習(xí)設(shè)計(jì)模式的Friends還是買本紙質(zhì)書系統(tǒng)的學(xué)習(xí)。下面,我給出一個(gè)真實(shí)的項(xiàng)目來(lái)引出我對(duì)這個(gè)項(xiàng)目的思考。第一次寫博客分享我的思路,在加上我的思維有些女性思維,是跳躍性的。可能有些表達(dá)不是很清楚。望大家見(jiàn)諒。

    • 看到這流程圖,首先在我腦海里的就是這是由一個(gè)一個(gè)小方塊組合起來(lái)的組合體。我們先不管具體代碼該怎么寫,類怎么設(shè)計(jì)。只知道這是一個(gè)組合體。會(huì)有很多類。說(shuō)到組合,我們是否可以聯(lián)想到這應(yīng)該是一個(gè)結(jié)構(gòu)型的設(shè)計(jì)。這個(gè)組合體是由這些小方塊代表的類按照某種結(jié)構(gòu)組合起來(lái)的。結(jié)構(gòu)型的設(shè)計(jì)模式有哪些,大家腦海里應(yīng)該會(huì)有個(gè)輪廓了。
    • 又看到每一個(gè)小方塊有分支,2個(gè)分支,分別代表正確的時(shí)的下一個(gè)流程和不正確時(shí)的下一個(gè)流程。這是不是意味著,我的方法會(huì)一層一層往下調(diào)用,直到最后一個(gè)小方塊對(duì)象的下個(gè)流程對(duì)象為null時(shí)停止。想到這,我腦海里想到了裝飾者模式和職責(zé)鏈模式。可是裝飾者模式?jīng)]有判斷條件,它只是按照你組合的順序,依次往下調(diào)用。那么這是不是更加符合職責(zé)鏈模式呢?咋一看很像,職責(zé)鏈模式是在一個(gè)流程內(nèi),沒(méi)有處理的權(quán)限就往后傳遞,有處理權(quán)限就跳出方法鏈。跟我們的2個(gè)分支有些不同。我們的需求是要既有權(quán)限處理往后傳遞,沒(méi)有權(quán)限也要往后傳遞。想到這,我們就清楚了,在小方塊所代表的類里,應(yīng)當(dāng)有兩個(gè)屬性,一個(gè)是判斷條件為True時(shí)的下一流程對(duì)象,另一個(gè)是判斷條件為False時(shí)下一流程對(duì)象。這樣,小方塊類的類結(jié)構(gòu)里就有了兩個(gè)屬性了。
      1. 每個(gè)小方塊都有兩個(gè)屬性,我們是否就應(yīng)該有個(gè)規(guī)范呢?所以我們定義一個(gè)接口,讓所有的小方塊代表的類實(shí)現(xiàn)這個(gè)接口。接口里目前有兩個(gè)屬性。
    • 接著又想,每個(gè)小方塊代表的類,所執(zhí)行的具體業(yè)務(wù)邏輯不一樣,所以,我們?cè)诮涌诶锸欠駪?yīng)該有個(gè)方法可供子類重寫呢?這樣一來(lái),每個(gè)小方塊所代表的類都有了自己的業(yè)務(wù)邏輯。但是,那在什么地方調(diào)用下個(gè)流程的業(yè)務(wù)邏輯呢?如果放在單獨(dú)的每個(gè)小方塊所代表的類中,那豈不是,我們?cè)诿恳粋€(gè)小方塊類中都要寫一些重復(fù)的調(diào)用下個(gè)流程的代碼呢?這樣就不夠優(yōu)雅了。所以,我想要調(diào)用過(guò)程在父級(jí)類里實(shí)現(xiàn)。為了實(shí)現(xiàn)小方塊類的多態(tài)和調(diào)用下個(gè)流程的代碼復(fù)用,就有了一個(gè)能夠有方法實(shí)現(xiàn)的類。這個(gè)類又必須包含抽象方法。那所有流程的抽象基類出來(lái)了。這個(gè)抽象類實(shí)現(xiàn)之前定義的接口。其實(shí)這個(gè)接口要不要都無(wú)所謂啦,不過(guò)好像每個(gè)設(shè)計(jì)模式都是從接口開(kāi)始,那么就保留一個(gè)接口吧。
    • 抽象類有了,每個(gè)子類重寫的業(yè)務(wù)邏輯方法也有了。接下來(lái),就是寫調(diào)用被重寫的業(yè)務(wù)邏輯的方法了。此處,大家應(yīng)該可以想到是一個(gè)模板方法吧。但是,我們這里有兩個(gè)分支,具體調(diào)用哪一個(gè)分支是由當(dāng)前的小方塊類決定的。這樣一想,那這個(gè)調(diào)用下個(gè)小方塊類的業(yè)務(wù)邏輯方法的代碼豈不是只能寫在具體的每個(gè)小方塊類里了。這樣不是很麻煩嗎?我們要想一個(gè)辦法,將這個(gè)過(guò)程放在抽象類里解決。鑒于最多也就兩個(gè)分支,不是正就是反。那么我們是否可以通過(guò)在抽象類里設(shè)置一個(gè)屬性,來(lái)標(biāo)識(shí)下一流程具體調(diào)用的是哪一個(gè)分支呢?所以我們抽象類里又有了一個(gè)屬性。這個(gè)屬性是要被子類在業(yè)務(wù)邏輯方法中重新賦值的。
      1. 在抽象類的調(diào)用下一流程的方法里,我們會(huì)有一個(gè)判斷,判斷這個(gè)屬性所代表的下一流程具體是哪一個(gè)分支。
    • 當(dāng)某些業(yè)務(wù)處理完之后,可能就直接要結(jié)束整個(gè)流程,比如說(shuō),如果我第一步驗(yàn)證沒(méi)通過(guò),那么后面的流程都不能被執(zhí)行。所以,我們要能夠隨時(shí)退出整個(gè)流程。這樣,我們跟上面決定調(diào)用哪個(gè)分支的設(shè)計(jì)思路一致,加一個(gè)屬性,來(lái)標(biāo)識(shí)說(shuō)是否要結(jié)束整個(gè)流程。可供子類重新賦值。在父類的調(diào)用下一個(gè)流程的方法中做判斷。
  • 那現(xiàn)在我們的抽象類里就有了3個(gè)屬性,2個(gè)方法。
    1. 當(dāng)條件判斷為True時(shí)的下一流程屬性
    2. 當(dāng)條件判斷為False時(shí)的下一流程屬性
    3. 標(biāo)識(shí)下一流程調(diào)用哪一個(gè)分支的屬性
    4. 標(biāo)識(shí)是否結(jié)束整個(gè)流程的屬性
    5. 封裝了調(diào)用過(guò)程的方法
    6. 需要被重寫的的具體業(yè)務(wù)邏輯方法
  • 然后,總有參數(shù)要傳遞到每一個(gè)小方塊類的業(yè)務(wù)邏輯方法中吧。那么我們這里就將所有參數(shù)封裝成一個(gè)數(shù)據(jù)實(shí)體類。依次傳遞到每個(gè)小方塊類的業(yè)務(wù)邏輯方法中。大概思路就說(shuō)到這吧。還有一些業(yè)務(wù)需求沒(méi)有講到,那在代碼里都有體現(xiàn)。先上代碼吧。

    /// <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>        /// 當(dāng)前流程是否處理通過(guò)        /// </summary>        private bool IsRight { get; set; }        /// <summary>        /// 流程是否結(jié)束        /// </summary>        private bool IsEnd { get; set; }        /// <summary>        /// 下一個(gè)流程,當(dāng)流程處理操作通過(guò)的時(shí)候        /// </summary>        private ProcessFlowBase NextProcessFlowWhenRight { set; get; }        /// <summary>        /// 下一個(gè)流程,當(dāng)流程處理操作不通過(guò)的時(shí)候        /// </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>        /// 流程處理模板方法,供子類實(shí)現(xiàn)        /// </summary>        /// <param name="dataContext"></param>        protected abstract void ProcessTemplate(DataContext dataContext);        /// <summary>        /// 記錄日志,供子類實(shí)現(xiàn)        /// </summary>        /// <param name="dataContext"></param>        protected virtual void RecordLog(DataContext dataContext)        {            LogHelper.Record(dataContext);        }        /// <summary>        /// 結(jié)束本次流程        /// </summary>        protected void EndProcessFlow()        {            this.IsEnd = true;        }        /// <summary>        /// 確定下一流程,后續(xù)候選流程名單在調(diào)用構(gòu)造函數(shù)的時(shí)候已經(jīng)初始化好        /// </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>        /// 設(shè)置下一流程單例屬性        /// </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>    /// 檢驗(yàn)授權(quán)碼流程,此流程應(yīng)當(dāng)作為所有業(yè)務(wù)流程的入口流程。會(huì)在此類中做一些特別的處理    /// </summary>    public class CheckToken : ProcessFlowBase    {        public CheckToken(ProcessFlowBase processFlowWhenRight = default(ProcessFlowBase),            ProcessFlowBase processFlowWhenWrong = default(ProcessFlowBase))            : base(processFlowWhenRight, processFlowWhenWrong)        {            //這個(gè)流程作為所有業(yè)務(wù)處理的入口流程,所以,我在這里要寫入一段初始化流程事務(wù)對(duì)象的代碼,僅執(zhí)行一次            base.DbConnection = LogHelper.CreateDbConnection();            base.DbConnection.Open();            base.DbCommand = base.DbConnectio
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 海安县| 许昌市| 石棉县| 勐海县| 武平县| 司法| 潜山县| 南充市| 宿松县| 安义县| 珲春市| 德钦县| 迁安市| 义乌市| 平阴县| 开封市| 鱼台县| 秭归县| 新建县| 紫阳县| 双峰县| 霍邱县| 贡觉县| 大化| 吐鲁番市| 图们市| 泸定县| 灵石县| 上蔡县| 永城市| 宜川县| 右玉县| 扎赉特旗| 汝南县| 古田县| 榕江县| 平武县| 翁牛特旗| 民勤县| 临湘市| 临潭县|