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

本文介绍了一种设计模式——职责链模式,并通过一个请假审批流程的例子详细解析了该模式的实现方式。利用抽象类定义基本行为并通过子类进行具体实现,实现了请求处理者的链式结构。

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值