设计模式-职责链模式-创新互联

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

南京网站制作公司哪家好,找成都创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站建设等网站项目制作,到程序开发,运营维护。成都创新互联公司自2013年创立以来到现在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();
        }

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:设计模式-职责链模式-创新互联
本文地址:http://myzitong.com/article/deepei.html