温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

设计模式-职责链模式

发布时间:2020-08-09 12:18:29 来源:网络 阅读:272 作者:全嗲吉祥 栏目:编程语言

场景:用户输入账号密码登录,
判断用户名是否正确,密码是否正确,用户名是否过期,用户名是否注销。

//用户
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