【设计模式】——责任链模式

【责任链模式】

 

责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止

 

【介绍】

 

  • 主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无需关系请求的处理细节和请求的传递,所哟职责链将请求的发送者和请求的处理者解耦了

  • 何时使用:在处理消息的时候过滤了很多处理者

  • 如何解决:拦截类都实现统一接口

  • 关键代码:Handler里面聚合他自己,在HanleRequest里判断是否合适,如果没有达到条件则向下传递,向传递之前set进去

  • 优点:降低了耦合都,它将请求的发送者和接收者解耦了;简化了对象,是的对象不需要知道链的结构;增强给对象指派职责的灵活性,通过改变链内的成员或者调动他们的次序,允许动态地新增或者删除责任;增加新的请求处理类很方便

  • 缺点:不能保证请求一定被接受;系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用;可能不宜观允许时的特性,有碍于维护

 

【实现】

 

 

步骤一:管理者类,定义一个处理请示的接口


 

abstract class Manager

    {

        protected string name;

        //管理者的上级

        protected Manager superior;

        public Manager(string name)

        {

            this.name = name;

        }

        //设置管理者的上级

        public void SetSuperior(Manager superior)

        {

            this.superior = superior;

        }

        //审批请求

        abstract public void RequestApplications(Request request);

    }

步骤二:具体处理者类,处理它所负责的请求,可访问它的后继者


 

//纪委

    class Discipline : Manager

    {

        public Discipline(string name) : base(name)

        {



        }

        public override void RequestApplications(Request request)

        {   //纪委所能有的权限就是可准许两小时内的假期

            if (request.RequestType == "请假" && request.Number <= 2)

            {

                Console.WriteLine("{0}:{1}  请假时间:{2}小时 已批准", name, request.RequestContent, request.Number);

            }

            else

            {

                if (superior != null)

                {

                    superior.RequestApplications(request);

                }

            }

        }

    }

    //纪老师

    class JIteacher : Manager

    {

        public JIteacher(string name):base (name)

        {



        }

        public override void RequestApplications(Request request)

        {   //纪老师所能有的权限就是可准许10小时内的假期

            if (request.RequestType == "请假" && request.Number <= 10)

            {

                Console.WriteLine("{0}:{1}  请假时间:{2}小时 已批准", name, request.RequestContent, request.Number)

            }

            else

            {

                if (superior != null)

                {

                    superior.RequestApplications(request);

                }

            }

        }

    }

    //米老师

    class Miteacher : Manager

    {

        public Miteacher(string name) : base(name)

        {



        }

        public override void RequestApplications(Request request)

        {   //米老师所以都处理

            if (request.RequestType == "请假")

            {

                Console.WriteLine("{0}:{1}  请假时间:{2}小时 已批准", name, request.RequestContent, request.Number);

            }

          

        }

    }

步骤三:申请类


 

class Request

    {

        //申请类别

        private string requestType;

        public string RequestType

        {

            get { return requestType; }

            set { requestType = value; }

        }



        //申请内容

        private string requestContent;

        public string RequestContent

        {

            get { return requestContent; }

            set { requestContent = value; }

        }



        //时间

        private int number;

        public int Number

        {

            get { return number; }

            set { number = value; }

        }

    }



步骤四:客户端代码


 

  static void Main(string[] args)

        {

            Discipline jiwei = new Discipline("十五期纪委");

            JIteacher jilaoshi = new JIteacher("纪老师");

            Miteacher milaoshi = new Miteacher("米老师");

            //设置上级,根据实际需求可改

            jiwei.SetSuperior(jilaoshi);

            jilaoshi.SetSuperior(milaoshi);



            Request request = new Request();

            request.RequestType = "请假";

            request.RequestContent = "皮皮华";

            request.Number = 1;

            jiwei.RequestApplications(request);



            Request request1 = new Request();

            request1.RequestType = "请假";

            request1.RequestContent = "皮皮杰";

            request1.Number = 5;

            jiwei.RequestApplications(request1);



            Request request2 = new Request();

            request2.RequestType = "请假";

            request2.RequestContent = "皮皮飞";

            request2.Number = 20;

            jiwei.RequestApplications(request2);



            Console.Read();

        }

步骤六:显示结果


 

十五期纪委:皮皮华  请假时间:1小时 已批准

纪老师:皮皮杰  请假时间:5小时 已批准

米老师:皮皮飞  请假时间:20小时 已批准

 

【总结】

 

请假成功。

 

猜你喜欢

转载自blog.csdn.net/damishidai15/article/details/83902298