当前位置: 首页 > news >正文

设计模式--职责链(学习)

职责链---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(); } }

 

 

转载于:https://www.cnblogs.com/anbylau2130/p/3688722.html

相关文章:

  • [.NET 即时通信SignalR] 认识SignalR (一)
  • php统计在线人数,精确的统计在线人数的办法
  • 世界货币符号大全
  • 《每日一博》——学习
  • WhyDX9:翻写D3D红龙书中的程序
  • hive行转多列LATERAL VIEW explode
  • POJ-1182-食物链 解题报告
  • 关于WCF开发 相应流程注意事项
  • asp.net mvc部署
  • [leetcode]_String to Integer (atoi)
  • 收到offer 7B
  • Python学习_算数运算函数
  • 【struts2】Result和ResultType
  • JVM调优[转]
  • cocos2d-x3.0 编译android出现的问题笔记  cocos2dx3.0 Android.mk No rule to make target
  • CSS3 变换
  • k8s 面向应用开发者的基础命令
  • LeetCode18.四数之和 JavaScript
  • nfs客户端进程变D,延伸linux的lock
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python 反序列化安全问题(二)
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Vim Clutch | 面向脚踏板编程……
  • WePY 在小程序性能调优上做出的探究
  • 阿里云前端周刊 - 第 26 期
  • 简单数学运算程序(不定期更新)
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 突破自己的技术思维
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # centos7下FFmpeg环境部署记录
  • #Z0458. 树的中心2
  • #微信小程序:微信小程序常见的配置传值
  • (06)金属布线——为半导体注入生命的连接
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2022 CVPR) Unbiased Teacher v2
  • (a /b)*c的值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (学习日记)2024.01.19
  • ./configure、make、make install 命令
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core 版本不支持的问题
  • .NET Micro Framework初体验
  • .Net的DataSet直接与SQL2005交互
  • .NET项目中存在多个web.config文件时的加载顺序
  • /etc/skel 目录作用
  • []Telit UC864E 拨号上网
  • [04] Android逐帧动画(一)
  • [20150629]简单的加密连接.txt
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [HCTF 2018]WarmUp (代码审计)
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口