再次领悟设计模式-职责链

来源:互联网 发布:安徽芜湖java 编辑:程序博客网 时间:2024/06/13 18:39

   前言:今天在进行操作的时候,出现了很多的判断,这样打的逻辑判断还是建的次数很好的,要想抽出来做另一些操作很难,因此就需要把这些判断抽出来做成类来调用,职责链就来救场。

 

   首先我们需要了解什么是链:一系列节点的集合,每个节点都可以灵活的拆解、重组,在灵活的组合下,我们需要做什么样的判断,只需要调用即可,避免了大量的if判断。

    职责链模式应用之审批管理:

                发审批这件事,我们每一个人都不陌生,即时通讯的方法很快处理我们的请求,极大的方便我们的处事效率。在TGB如果你请求的时间小于2小时,那么只需向纪委发个审批,及时通知纪委就能准假。但是如果超过2小时,就需要向BOSS请求处理,当然这是需要一定的条件。时间更长的话就需要做好休息一星期的准备,因为老总的处理可是有代价的。

        /****************验证start****************/        /// <summary>        /// 点击提交,运用职责链思想,进行验证,从而进行订单        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        protected void Button1_Click(object sender, EventArgs e)        {            //遍历检查GridView1是否有选择            int k = 0;            for (int i = 0; i < GridView1.Rows.Count; i++)            {                CheckBox chk = (CheckBox)(GridView1.Rows[i].FindControl("ckbSelect"));                if (chk.Checked == true)                {                    k = k+1;                    break;                }                            }            //如果 GridView1有选择任何一项,则执行此项            if (k > 0)            {                //如果大于零,进入“所选日期与菜单是否匹配”方法               <span style="color:#ff0000;"> checkTime();</span>            }            else            {                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('您未选择任何菜');</script>");            }                        //逻辑                   }        /// <summary>        /// 所选日期与菜单不匹配-十二期杨晓风、赵尽朝-2016-8-14 09:35:16        /// </summary>        public void <span style="color:#ff0000;">checkTime()</span>        {            string maketime = "";            maketime = Quantum(maketime);            quantum = Session["quantum"].ToString();            ButtonClickTime = Session["ButtonClickTime"].ToString();            if (ButtonClickTime != menusTime.Value | maketime != quantum)            {                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript'defer>alert('所选日期与菜单不匹配,请点击‘刷新菜单’');</script>>");            }            else            {                //如果所选日期与菜单匹配,则进入此方法,判断当天是否提交过订单                <span style="color:#ff0000;">checkByond();</span>            }        }        ///////////////////////////////////////////////////////////////////////////        /// <summary>        /// 若当天提交过订单则不允许再次提交订单        /// </summary>        public void checkByond()        {            string dateOfToday;            //int hourOfToday;            dateOfToday = DateTime.Now.Date.ToString("yyyy-MM-dd");            // hourOfToday = DateTime.Now;            //若当天提交过订单则不允许再次提交订单            OrderSheet ordersheet = new OrderSheet();            SelectFood foodbll = new SelectFood();            bool flag;            if (Lunch.Checked == true)            {                ordersheet.eatTimeQuantum = "中午";            }            if (Dinner.Checked == true)            {                ordersheet.eatTimeQuantum = "晚上";            }            ordersheet.OrderDate = menusTime.Value;            ordersheet.CardNo = Session["Admin"].ToString();            flag = foodbll.isHaveOrder(ordersheet);            if (flag == true)            {                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript'defer> Dialog.confirm('您今天已经提交过订单,你确定要重复提交订单么?', function () {document.getElementById('ReSubmit').click();});</script>>");            }            else            {                //如果当天没有提交过订单,则进入“每天订餐时间点的限制”的方法                <span style="color:#ff0000;">checkBeyondHour()</span>;            }        }        protected void ReSubmit_Click(object sender, EventArgs e)        {            checkBeyondHour();        }        ///////////////////////////////////////////////////////////////////////////        /// <summary>f        /// 如果条件为今天十点半以后则提醒,可以提交明天或以后订单        /// </summary>        public void checkBeyondHour()        {            string dateOfToday;            //int hourOfToday;            dateOfToday = DateTime.Now.Date.ToString("yyyy-MM-dd");            //十点半后不能提交当天的订单,只能浏览菜单,可以提交今天以后的菜单---焦玉丽---2016年7月24日11:53:19            //如果条件为今天十点半以后则提醒,可以提交明天或以后订单            int hourOfToday = Convert.ToDateTime(limitOrder).CompareTo(DateTime.Now);            if (menusTime.Value == dateOfToday && hourOfToday < 0)            {                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript'defer>alert('请在" + limitOrder + "之前订餐!现在您可以预订本周剩余几天的饭菜。');</script>>");            }            else            {                //如果没有超过订餐时间点的限制,则进入选择菜的方法                <span style="color:#ff0000;">checkNumPrince()</span>;            }        }        ////////////////////////////////////////////////////////////////////////////        /// <summary>        /// 如果某一行的CheckBox被选中,则执行统计操作        /// </summary>        public void checkNumPrince()        {            T_OrderDetailSheet detailinfo = new T_OrderDetailSheet();            SelectFood selectfood = new SelectFood();            OrderSheet orderinfo = new OrderSheet();            //订单ID            orderinfo.OrderId = DateTime.Now.ToString("MMddHHmmssffff");            //就餐时间段            orderinfo.OrderDate = menusTime.Value;            //卡号            //TODO:假数据2            orderinfo.CardNo = Session["Admin"].ToString();            // orderinfo.CardNo = "E000196";            List<T_OrderDetailSheet> list = new List<T_OrderDetailSheet>();            DataTable dt = new DataTable();            //提交            decimal numScore = 0;            for (int i = 0; i < GridView1.Rows.Count; i++)            {                //如果某一行的CheckBox被选中,则执行统计操作                CheckBox chk = (CheckBox)(GridView1.Rows[i].FindControl("ckbSelect"));                if (chk.Checked == true)                {                    decimal yg = Convert.ToDecimal(GridView1.Rows[i].Cells[3].Text) * Convert.ToDecimal(GridView1.Rows[i].Cells[4].Text.Trim());                    //string a = GridView1.Rows[i].Cells[3].Text;                    //string b = GridView1.Rows[i].Cells[4].Text;                    //获取单个事物ID,和数量                    detailinfo.FoodId = GridView1.Rows[i].Cells[1].Text;                    detailinfo.Num = GridView1.Rows[i].Cells[4].Text;                    detailinfo.OrderId = orderinfo.OrderId;                    selectfood.InsertOrderDetail(detailinfo);                    numScore = numScore + yg;                }            }            //如果 选择任何菜,则进入此方法            <span style="color:#ff0000;">checkNumT(numScore, orderinfo, selectfood);</span>        }        ////////////////////////////////////////////////////////////////////////////////        /// <summary>        /// 如果所选择的食物不在今天的菜单列中则报错        /// </summary>        /// <param name="numScore"></param>        /// <param name="orderinfo"></param>        /// <param name="selectfood"></param>        public void checkNumT(decimal numScore, OrderSheet orderinfo, SelectFood selectfood)        {            if (numScore != 0)            {                ////如果所选择的食物不在今天的菜单列中则报错                RadioButton radio = new RadioButton();                //T代表下午在这吃,F代表下午不在这吃                if (Yes.Checked == true)                {                    orderinfo.IsDinnerEat = "T";                }                if (No.Checked == true)                {                    orderinfo.IsDinnerEat = "F";                }                if (No.Checked != true && Yes.Checked != true)                {                    orderinfo.IsDinnerEat = "F";                }                <span style="color:#ff0000;">checkEatPlace(numScore, orderinfo, selectfood);</span>            }                    }        //////////////////////////////////////////////////////////////////////        /// <summary>        /// 晚上是否在餐厅吃饭        /// </summary>        /// <param name="numScore"></param>        /// <param name="orderinfo"></param>        /// <param name="selectfood"></param>        public void checkEatPlace(decimal numScore, OrderSheet orderinfo, SelectFood selectfood)        {            //晚上是否在餐厅吃饭            if (Lunch.Checked == true)            {                // orderinfo.IsDinnerEat = "F";                orderinfo.eatTimeQuantum = "中午";            }            if (Dinner.Checked == true)            {                orderinfo.IsDinnerEat = "NULL";                orderinfo.eatTimeQuantum = "晚上";            }            if (Lunch.Checked != true && Dinner.Checked != true)            {                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('请确认订餐时间段(早午餐或晚餐)');</script>");            }            else            {                <span style="color:#ff0000;">checkCash(numScore, orderinfo, selectfood);</span>            }        }        /////////////////////////////////////////////////////////////////////        /// <summary>        /// 如果卡余额不足支付本次订单,则提交失败        /// </summary>        /// <param name="numScore"></param>        /// <param name="orderinfo"></param>        /// <param name="selectfood"></param>        public void checkCash(decimal numScore, OrderSheet orderinfo, SelectFood selectfood)        {            //查询卡余额-焦玉丽-2016年7月27日10:42:42            SelectFood myBLL = new SelectFood();            string cardId = Session["Admin"].ToString();            Decimal cash = myBLL.InquireCash(cardId);            lblRem.Text = cash.ToString();            //如果卡余额不足支付本次订单,则提交失败            if (cash < numScore)            {                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('订单提交失败! 余额不足,请及时充值');</script>");            }            else            {               <span style="color:#ff0000;"> checkOrder(numScore, orderinfo, cash, selectfood);</span>            }        }        ////////////////////////////////////////////////////////////////////        /// <summary>        /// 查询历史订单,若累计订单和大于余额值,则不能提交        /// </summary>        /// <param name="numScore"></param>        /// <param name="orderinfo"></param>        /// <param name="cash"></param>        /// <param name="selectfood"></param>        public void checkOrder(decimal numScore, OrderSheet orderinfo, Decimal cash, SelectFood selectfood)        {            //查询历史订单,若累计订单和大于余额值,则不能提交--焦玉丽--2016年7月31日09:48:43            DataTable sumcash = new DataTable();            string cardno = Session["Admin"].ToString();            SelectFood bll = new SelectFood();            sumcash = bll.QuerySumCash(cardno);            string Cash = sumcash.Rows[0][0].ToString();            decimal sumBalacnce;            if (Cash == "")            {                sumBalacnce = numScore;            }            else            {                sumBalacnce = Convert.ToDecimal(Cash) + numScore;            }            if (cash < sumBalacnce)            {                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('订单提交失败! 余额不足,请及时充值');</script>");            }            else            {               <span style="color:#ff0000;"> submitOrderCore(numScore, orderinfo, cash, selectfood);</span>            }        }        //////////////////////////////////////////////////////////////////        /// <summary>        /// 菜单显示当天全部-十二期杨晓风、赵尽朝-2016-8-14 09:52:40        /// </summary>        /// <param name="numScore"></param>        /// <param name="orderinfo"></param>        /// <param name="cash"></param>        /// <param name="selectfood"></param>        public void submitOrderCore(decimal numScore, OrderSheet orderinfo, Decimal cash, SelectFood selectfood)        {            //将数据插入到订单总表中            orderinfo.TotalCost = Convert.ToString(numScore);            selectfood.InsertOrder(orderinfo);            ShowMenu();//显示菜单项            //this.Main.Style.Add("display", "none");////隐藏            Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('订单提交成功!  订单详情参见页尾');</script>");            //初始化界面            //修改人:焦玉丽            //修改时间:2016年7月26日10:47:50            Lunch.Checked = true;            No.Checked = true;        }        #endregion

        职责链的灵活性:

 

  1. 改变内部的传递规则。2.可以从职责链任何一关开始。

 

 

      发审批这件事我们试不陌生的,审批这种能即时通讯的请求方式,极大的方便了我们处理事务的效率。在这里

 

            

 

0 0
原创粉丝点击