zoukankan      html  css  js  c++  java
  • 设计模式--职责链(学习)

    职责链---http://www.cnblogs.com/sc0791/p/3687856.html 

      /// <summary>
        /// 请求类 场景
        /// </summary>
        class Context
        {
            public Context(int day)
            {
                this.day = day;
            }
            private int day;
     
            public int Day
            {
                get { return day; }
                set { day = value; }
            }
     
        }

    代码剖析

    首先,该模式运用的是最基本的继承关系

    1,抽象类--提供操作人的姓名,并保存一个该类的实例,同时提供一个抽象的Pass方法

       /// <summary>
        /// 抽象基类
        /// </summary>
        abstract class Handler
        {
            public Handler(string name)
            {
                _name = name;
            }
            private string _name;
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
            private Handler _handler;
            public Handler handler
            {
                get { return _handler; }
                set { _handler = value; }
            }
            //是否通过
            public abstract bool Pass(Context context);
        }

    子类--用于重写pass方法,给对象的handler赋值,在pass方法中通过调用指定handler属性实现一级一级的向下传递(这里的handler为下一级别的更高权限的操作)

     /// <summary>
        /// 部门经理 2天以下的部门签字就成了
        /// 
        /// </summary>
        public class Manager : Handler
        {
            public Manager(string name)
                : base(name)
            { }
            public override bool Pass(Context context)
            {
                if (context.Day <= 2)
                {
                    Console.Write("{0}已经签字通过", Name);
                    return true;
                }
                return handler.Pass(context);
            }
        }
        /// <summary>
        /// 总经理 2天以上需要总经理签字
        /// </summary>
        public class GeneralManager : Handler
        {
            public GeneralManager(string name)
                : base(name)
            { }
            public override bool Pass(Context context)
            {
                if (2 < context.Day)
                {
                    Console.Write("{0}已经签字通过", Name);
                    return true;
                }
                return handler.Pass(context);
            }
        }
        /// <summary>
        /// 董事长 7天以上需要总经理签字
        /// </summary>
        public class President : Handler
        {
            public President(string name)
                : base(name)
            { }
            public override bool Pass(Context context)
            {
                if (context.Day > 7)
                {
                    Console.Write("{0}已经签字通过", Name);
                    return true;
                }
                return handler.Pass(context);
            }
        }

    操作代码--通过指定的天数,判断是哪个级别的范围,不在本类范围内的交给handler操作

     class Program
        {
            static void Main(string[] args)
            {
                Context context = new Context(3);
                Handler manager = new Manager("部门经理");
                Handler gmanager = new GeneralManager("总经理");
                Handler president = new President("董事长");
           //通过给其handler赋值实现传递 manager.handler
    = gmanager;     //部门经理的上级是总经理 gmanager.handler = president;     //总经理的上级是董事长 manager.Pass(context); //调用最初级的pass方法 Console.ReadLine(); } }
  • 相关阅读:
    路由基础、多app共存,路由分配、路由分发(将app自己的路由分发给应用自身管理)、反解
    Django项目的创建与介绍,三件套,静态文件,配置Mysql完成数据迁移,单表ORM记录的增删改查
    Django框架导读
    Flask简易版本、Ajax、DOM操作,表单操作
    JQuery
    0820-信心赛
    codeforces比赛总(吐)结(嘈)
    洛谷P3403 跳楼机(最短路)
    求逆序对的三种方法
    NKOJ 3751 扫雷游戏
  • 原文地址:https://www.cnblogs.com/anbylau2130/p/3688722.html
Copyright © 2011-2022 走看看