职责链模式

1.职责链

namespace DutyChainPattern
{
    /// <summary>
    /// 职责链模式:就是一个将请求或命令进行转发的流程,类似工作流。
    /// 并且,也非常类似状态模式,它们共同的特点就是将一个复杂的判
    /// 断逻辑,转移到各个子类,然后在由子类进行简单判断
    ///
    /// 状态模式与职责链模式的区别:
    /// 状态模式是让各个状态对象自己知道其下一个处理的对象是谁,即在编译时便设定好了的;
    /// 而职责链模式中的各个对象并不指定其下一个处理的对象到底是谁,只有在客户端才设定。
    /// </summary>
    public abstract class RequestTransmit
    {
        protected RequestTransmit superior;//上级

        /// <summary>
        /// 用来设置职责链上那个节点来处理请求
        /// </summary>
        /// <param name="superiorObj"></param>
        public void SetSuperior(RequestTransmit superiorObj)
        {
            superior = superiorObj;
        }

        /// <summary>
        /// 用来处理请求
        /// </summary>
        /// <param name="request"></param>
        public abstract void TransmitRequest(int request);
    }

    /// <summary>
    /// 班主任:职责链上的一个节点,在里面进行判断,看能否处理请求,不能则将请求转移
    /// </summary>
    public class ClassAdviser : RequestTransmit
    {
        public override void TransmitRequest(int request)
        {
            if (request < 2)//假设:小于两天
                Console.WriteLine("班主任:你请{0}天假可以通过", request);
            else
            {
                Console.WriteLine("{0}不能处理,将请求发送到上一级",this.ToString());
                superior.TransmitRequest(request);//不能处理就将请求转移
            }
        }
    }

    /// <summary>
    /// 辅导员
    /// </summary>
    public class Counselor : RequestTransmit
    {
        public override void TransmitRequest(int request)
        {
            if (request >= 2 && request <= 5)
                Console.WriteLine("辅导员:你请{0}天假可以通过", request);
            else
            {
                Console.WriteLine("{0}不能处理,将请求发送到上一级", this.ToString());
                superior.TransmitRequest(request);//不能处理就将请求转移
            }
        }
    }

    /// <summary>
    /// 辅导员
    /// </summary>
    public class Secretary : RequestTransmit
    {
        public override void TransmitRequest(int request)
        {
            if (request > 5 && request < 10)
                Console.WriteLine("书记:你请{0}天假可以通过", request);
            else
                Console.WriteLine("你退学算了");
        }
    }
}

2.调用

       static void Main(string[] args)
        {
            RequestTransmit p1 = new ClassAdviser();
            RequestTransmit p2 = new Counselor();
            RequestTransmit p3 = new Secretary();

            /*
             * 客户端调用时设置好职责链,此处应该简化,客户端只需发出请求即可,
             * 并不需要知道请求处理的流程,就和浏览器原理一样。
             * 在此处可以看出,职责链模式和状态模式的最大区别在于处理请求的下
             * 一个对象在什么地方设定
             */
            p1.SetSuperior(p2);
            p2.SetSuperior(p3);

            p1.TransmitRequest(1);

            Console.ReadKey();
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值