真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

設(shè)計(jì)模式-職責(zé)鏈模式

場(chǎng)景:用戶輸入賬號(hào)密碼登錄,
判斷用戶名是否正確,密碼是否正確,用戶名是否過期,用戶名是否注銷。

10余年建站經(jīng)驗(yàn), 成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)客戶的見證與正確選擇。創(chuàng)新互聯(lián)建站提供完善的營銷型網(wǎng)頁建站明細(xì)報(bào)價(jià)表。后期開發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。

//用戶
class User
    {
        public string name { get; set; }
        public string password { get; set; }
        public string state { get; set; }
    }

abstract class Approve
    {
        protected User user;
        public Approve(User _user)
        {
            user = _user;
        }
        protected Approve superStep;
        public void SetSuperApprove(Approve Approve)
        {
            superStep = Approve;
        }
        abstract public void ApproveRun();
    }
    class ApproveName : Approve
    {
        public ApproveName(User _user) : base(_user)
        {
        }

        public override void ApproveRun()
        {
            if (user.name != "張三")
            {
                Console.WriteLine("用戶名稱不正確");
            }
            else
            {
                if (superStep != null)
                {
                    superStep.ApproveRun();//交給客戶端設(shè)定的下個(gè)處理者,名稱正確,下面驗(yàn)證密碼
                }
            }
        }
    }
    class ApprovePassword : Approve
    {
        public ApprovePassword(User _user) : base(_user)
        {
        }

        public override void ApproveRun()
        {
            if (user.password != "123456")
            {
                Console.WriteLine("用戶密碼不正確");
            }
            else
            {
                if (superStep != null)
                {
                    superStep.ApproveRun();//密碼正確,下面驗(yàn)證狀態(tài)
                }
            }
        }
    }
    class ApproveState : Approve
    {
        public ApproveState(User _user) : base(_user)
        {
        }

        public override void ApproveRun()
        {
            if (user.state == "-1")
            {
                Console.WriteLine("用戶已注銷");
            }
            else if (user.state == "-2")
            {
                Console.WriteLine("用戶已過期");
            }
            else
            {
                Console.WriteLine("用戶登錄成功");
            }
        }
    }       
        //前端
        static void Main(string[] args)
        {
            User user = new User();
            user.name = "張三1";
            user.password = "123456";
            user.state = "-1";

            Approve stepName = new ApproveName(user);
            Approve stepPassword = new ApprovePassword(user);
            Approve stepState = new ApproveState(user);

            stepName.SetSuperApprove(stepPassword);//客戶設(shè)置下一個(gè)處理者
            stepPassword.SetSuperApprove(stepState);

            stepName.ApproveRun();

            Console.WriteLine("--------------------------");

            Console.ReadLine();
        }

總結(jié):職責(zé)鏈模式其實(shí)就是把if條件抽象成對(duì)象,連成一條鏈;提交的請(qǐng)求,按鏈傳遞,如果當(dāng)前對(duì)象能處理就處理不然傳遞給下一個(gè)。避免了請(qǐng)求者和處理者的耦合。
優(yōu)點(diǎn):靈活,可隨時(shí)增加或減少職責(zé),
缺點(diǎn):客戶端需要清楚業(yè)務(wù)邏輯,然后把各個(gè)對(duì)象設(shè)置為鏈。

與狀態(tài)模式區(qū)別:
狀態(tài)模式: 當(dāng)前對(duì)象如果不能處理請(qǐng)求,自動(dòng)轉(zhuǎn)入下一個(gè)對(duì)象(提前設(shè)定好);有狀態(tài)管理類控制狀態(tài)對(duì)象的執(zhí)行;客戶端調(diào)用簡單,但是如果職責(zé)對(duì)象擴(kuò)展的話會(huì)違背開閉原則。
if else 改成狀態(tài)模式比較好

職責(zé)鏈模式:當(dāng)前對(duì)象如果不能處理請(qǐng)求,轉(zhuǎn)入的下一個(gè)對(duì)象需要客戶自己設(shè)定;客戶端需要知道所有職責(zé)對(duì)象的權(quán)限;客戶端設(shè)置繁瑣,但是職責(zé)對(duì)象靈活度很高。
swicth 改成職責(zé)鏈模式比較好

上面例子用狀態(tài)實(shí)現(xiàn)如下:

class User
    {
        public string name { get; set; }
        public string password { get; set; }
        public string state { get; set; }

    }
    abstract class Approve
    {
        public User user;       
        public Approve(User _user)
        {
            user = _user;            
        }       
        abstract public void ApproveRun(Context context);

    }
    class ApproveName : Approve
    {
        public ApproveName(User _user) : base(_user)
        {
        }

        public override void ApproveRun(Context context)
        {
            if (user.name != "張三")
            {
                Console.WriteLine("用戶名稱不正確");
            }
            else
            {
                context.Approve = new ApprovPassword(user);//交給下個(gè)對(duì)象處理,驗(yàn)證密碼
            }
        }
    }
    class ApprovPassword : Approve
    {
        public ApprovPassword(User _user) : base(_user)
        {
        }

        public override void ApproveRun(Context context)
        {
            if (user.password != "123456")
            {
                Console.WriteLine("用戶密碼不正確");
            }
            else
            {
                context.Approve = new ApprovState(user);
            }
        }
    }
    class ApprovState : Approve
    {
        public ApprovState(User _user) : base(_user)
        {
        }

        public override void ApproveRun(Context context)
        {
            if (user.state == "-1")
            {
                Console.WriteLine("用戶已過期");
            }
            else if (user.state == "-2")
            {
                Console.WriteLine("用戶已注銷");
            }
            else
            {
                Console.WriteLine("用戶登錄成功。");
            }
        }
    }
        static void Main(string[] args)
        {
            User user = new User();
            user.name = "張三";
            user.password = "123456";
            user.state = "-1";

            Approve stepName = new ApproveName(user);
            Context context = new Context(stepName);
            context.ApproveRun();
            Console.ReadLine();
        }

當(dāng)前名稱:設(shè)計(jì)模式-職責(zé)鏈模式
網(wǎng)頁地址:http://weahome.cn/article/pipooj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部