您当前的位置: 首页 > 

衣舞晨风

暂无认证

  • 0浏览

    0关注

    1156博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

职责链模式(chain of responsibility)

衣舞晨风 发布时间:2015-12-31 18:43:42 ,浏览量:0

原文地址

一. 写在前面的

这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式。

因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理。所以希望各位多多指教。

二. 什么是链

这里写图片描述 文章伊始,先让我们了解这个最基本的概念,什么是链。

我给链下了这样的定义:

  1. 链是一系列节点的集合。

  2. 链的各节点可灵活拆分再重组。

三. 何为职责链

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

图如下: 这里写图片描述

四. 职责链模式应用之请假管理

请假这个事情,相信每个人都不陌生。

我们公司是个相对很宽松的公司。

在公司里,如果你的请假时间小于0.5天,那么只需要向项目经理打声招呼就OK了。

如果超过了0.5天,但是还小于2天,那么就要去找人事部处理,当然,这就要扣工资了。

如果超过了2天,你就需要去找总经理了,工资当然也玩完了。

那么,对于我们来说,这个流程就是这样的。 这里写图片描述 也就是这样一个过程,你需要和你的直接上级——项目经理去打交道,最终可能是项目经理给你回邮件,可能是人事部给你回邮件,也可能是总经理给你回邮件。内部的过程其实应该是个黑盒子,你并不知道内部的消息是如何处理的。你需要找到的,只是你想要第一个交付的对象而已。 这里写图片描述 那么我们的代码应该是这样的。

首先我们要写一个请求的类。

class Request
{
    private int day;
    private string reason;
    public int Day
    {
        get { return day; }
        set { day = value; }
    }
    public string Reason
    {
        get { return reason; }
        set { reason = value; }
    }
    public Request(int day, string reason)
    {
        this.day = day;
        this.reason = reason;
    }
}

接下来看下请求相应者,他们有两个核心方法,一个是相应操作,一个是选择继任者。

abstract class Boss
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    private Boss successor;
    public Boss Successor
    {
        get { return successor; }
        set { successor = value; }
    }
    public Boss(string name)
    {
        this.name = name;
    }
    public abstract bool PassRequest(Request request);
}
class PM:Boss
{
    public PM(string name)
        : base(name)
    { }
    public override bool PassRequest(Request request)
    {
        int day = request.Day;
        string reason = request.Reason;
        if (day  0.5&&day=0.5&&day            
关注
打赏
1647422595
查看更多评论
0.0519s