亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

設計模式-職責鏈模式

發布時間:2020-08-09 12:18:29 來源:網絡 閱讀:273 作者:全嗲吉祥 欄目:編程語言

場景:用戶輸入賬號密碼登錄,
判斷用戶名是否正確,密碼是否正確,用戶名是否過期,用戶名是否注銷。

//用戶
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();//交給客戶端設定的下個處理者,名稱正確,下面驗證密碼
                }
            }
        }
    }
    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();//密碼正確,下面驗證狀態
                }
            }
        }
    }
    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);//客戶設置下一個處理者
            stepPassword.SetSuperApprove(stepState);

            stepName.ApproveRun();

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

            Console.ReadLine();
        }

總結:職責鏈模式其實就是把if條件抽象成對象,連成一條鏈;提交的請求,按鏈傳遞,如果當前對象能處理就處理不然傳遞給下一個。避免了請求者和處理者的耦合。
優點:靈活,可隨時增加或減少職責,
缺點:客戶端需要清楚業務邏輯,然后把各個對象設置為鏈。

與狀態模式區別:
狀態模式: 當前對象如果不能處理請求,自動轉入下一個對象(提前設定好);有狀態管理類控制狀態對象的執行;客戶端調用簡單,但是如果職責對象擴展的話會違背開閉原則。
if else 改成狀態模式比較好

職責鏈模式:當前對象如果不能處理請求,轉入的下一個對象需要客戶自己設定;客戶端需要知道所有職責對象的權限;客戶端設置繁瑣,但是職責對象靈活度很高。
swicth 改成職責鏈模式比較好

上面例子用狀態實現如下:

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);//交給下個對象處理,驗證密碼
            }
        }
    }
    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();
        }
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新密市| 康乐县| 板桥市| 平泉县| 长兴县| 静安区| 汪清县| 肇州县| 拉孜县| 柳州市| 循化| 巩留县| 名山县| 柘城县| 奇台县| 上虞市| 资兴市| 江川县| 宝应县| 江门市| 亚东县| 大港区| 上犹县| 隆回县| 夹江县| 仁布县| 大英县| 全州县| 获嘉县| 诸暨市| 扎鲁特旗| 宝应县| 平谷区| 龙里县| 剑阁县| 广丰县| 辽宁省| 乌苏市| 仙游县| 海门市| 施秉县|