设计模式-职责链模式

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

10余年建站经验, 成都网站设计、网站建设、外贸网站建设客户的见证与正确选择。创新互联建站提供完善的营销型网页建站明细报价表。后期开发更加便捷高效,我们致力于追求更美、更快、更规范。

//用户
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();
        }

网站名称:设计模式-职责链模式
标题路径:http://hbruida.cn/article/pipooj.html