五分钟一个设计模式之责任链模式

五分钟一个设计模式,用最简单的方法来描述设计模式。查看更多设计模式,请点击五分钟一个设计模式系列

http://blog.csdn.net/daguanjia11/article/category/3259443

请假流程

假设现在一个公司的请假流程如下:一天及以下由小组组长审批,一天以上三天以下由经理审批,三天以上七天以下由老板审批,七天以上直接劝退。

如果每次请假时都很长的if…else…来判断该去找谁请假,很不容易扩展,我们使用责任链模式来实现。

首先,是一个抽象的父类

public abstract class Handler
{
    private int days = 0;
    private Handler nextHandler;
    public void HandleRequest(float days)
    {
        if (IsInResposibilityScope(days))
        {
            Sign();
        }
        else
        {
            if (nextHandler != null)
            {
                nextHandler.HandleRequest(days);
            }
            else
            {
                Console.WriteLine("请假太久了,请直接提交辞职报告吧!");
            }
        }
    }

    /// <summary>
    /// 设置下一个处理请假请求的人
    /// </summary>
    /// <param name="nextHandler"></param>
    public void SetNext(Handler nextHandler)
    {
        this.nextHandler = nextHandler;
    }

    /// <summary>
    /// 这个请假天数是否在自己的职责范围内
    /// </summary>
    /// <returns></returns>
    protected abstract bool IsInResposibilityScope(float days);

    /// <summary>
    /// 领导签字,表示请假得到了审批
    /// </summary>
    protected abstract void Sign();

}

下面是几个继承自Handler的子类,分别是小组组长类,经理类和老板类

public class GroupLeader : Handler
{
    protected override bool IsInResposibilityScope(float days)
    {
        if (days <= 1)
        {
            return true;
        }
        return false;
    }

    protected override void Sign()
    {
        Console.WriteLine("主管签字同意了");
    }
}
public class Manager : Handler
{
    protected override bool IsInResposibilityScope(float days)
    {
        if (days > 1 && days <= 3)
        {
            return true;
        }
        return false;
    }

    protected override void Sign()
    {
        Console.WriteLine("经理签字同意了");
    }
}
public class Boss:Handler
{
    protected override bool IsInResposibilityScope(float days)
    {
        if (days > 3 && days <= 7)
        {
            return true;
        }
        return false;
    }

    protected override void Sign()
    {
        Console.WriteLine("老板签字同意了");
    }
}

好了,所有的类都有了,下面看如何来请假

class Program
{
    static void Main(string[] args)
    {
        GroupLeader groupLeader = new GroupLeader();
        Manager manager = new Manager();
        Boss boss = new Boss();

        //先设置好请假审批的先后顺序
        groupLeader.SetNext(manager);
        manager.SetNext(boss);

        //下面分别请假1、2、5、10天
        groupLeader.HandleRequest(1);
        groupLeader.HandleRequest(2);
        groupLeader.HandleRequest(5);
        groupLeader.HandleRequest(10);
    }
}

返回结果如下:

主管签字同意了

经理签字同意了

老板签字同意了

请假太久了,请直接提交辞职报告吧!

认识责任链模式

责任链模式的定义:使多个对象都能够处理请求,从而避免请求的发送者和接受者的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

在这个请假流程的处理中,请假者不需要知道他的请求需要提交给谁,只需要提交给责任链的第一个对象就行了,如果第一个对象处理不了的话,会自动交给链上的下一个对象。这就实现了请求的发送者和接收者解耦了。

如果处理请求的逻辑变了,如,小组长可以审批2天以内的请假流程了,或者新增了一个总监职位,可以处理一周内的请假流程等,只需要修改特定的类,或扩展新类,请求的发送者是不需要知道的,发送请求的代码也不需要修改。

时间: 2024-07-29 09:04:32

五分钟一个设计模式之责任链模式的相关文章

五分钟一个设计模式之装饰器模式

五分钟一个设计模式,用最简单的方法来描述设计模式.查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443 示例代码 今天实在是想不出什么开场白来引出示例了,也想不出特别有意思的示例了,就用一个很土的例子来描述一下装饰器模式吧. 每个人都要穿衣服,每件衣服都具有某些特定的功能,例如,穿上鞋子的话走路舒服,穿上上衣的话上身不冷,穿上裤子的话腿不冷(你这不废话吗).也就是说,每件衣服都具有特定的

五分钟一个设计模式之代理模式

五分钟一个设计模式,用最简单的方法来描述设计模式. 认识代理模式 代理模式是通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端得到这个代理对象后,就想得到了真实的对象一样.客户端调用代理对象来执行任务,但任务实际上最重还是由真实对象完成的. 代理模式的本质是控制对象的访问. 代理模式包含以下几部分: Subject:目标接口 RealSubject:具体的目标对象,继承自Subject Proxy:代理对象,继承自Subject,使用Proxy可以代替使用RealSubject. 示例

五分钟一个设计模式之创建者模式

五分钟一个设计模式,用最简单的方法来描述设计模式. 认识创建者模式 创建者模式(又叫生成器模式)是为创建一个产品而生的,这个产品的组装算法是确定的,但零部件可以分配给多个厂商生产.使用创建者模式来创建产品,可以把产品零部件的生产和组装分开了. 创建者模式包含以下几个部分: 产品(Product) 厂商的接口(Builder) 具体的厂商(ConcreteBuilder1.ConcreteBuilder2.-ConcreteBuilderN),实现厂商接口,负责产品零部件的生产工作 指导者(Dir

五分钟一个设计模式之命令模式

五分钟一个设计模式,用最简单的方法来描述设计模式. 小米智能模块的例子 前一段小米的老总雷军在印度的全英文演讲想必大家都还历历在目,不过今天我们讨论的主题不是那次演讲,而是小米智能模块.小米4发布时,雷军说,小米已经开发了一个智能模块,只要电器厂商将这个智能模块集成到自家的电器中,就可以用小米手机来控制它,并且小米智能模块才22块钱.是不是一件很牛X的事情?这个事情,从宏观上来看,通过小米手机来控制所有集成了智能模块的电器,就是使用了命令模式!下面我们来模拟一下这个事情. 首先,有一些家用电器的

五分钟一个设计模式之策略模式

五分钟一个设计模式,用最简单的方法来描述设计模式. 开发一个小游戏 还是先来看个例子吧. 有一天老板一拍脑袋,想做一个游戏,于是把你找来,告诉你他的想法: 做一个最简单的闯关游戏,每个关卡都有一些小怪兽,而游戏的角色通过打死所有小怪兽来通关 角色可以使用武器,先做三四个简单的武器,有一般的武器,有厉害的武器,每个武器的伤害值不一样 游戏过程中,角色可以更换武器 先做一个角色,以后可能增加新角色,但不同角色之间的区别现在还没想好. 你作为这个新游戏的主程序员,要做的就是使程序的架构足够灵活,能够为

设计模式之责任链模式20170717

行为型设计模式之责任链模式: 一.含义 责任链模式的核心在"链"上,"链"是由多个处理者(对象)组成的,由这条链传递请求,直到有对象处理它为止(在链中决定谁来处理这个请求),并返回相应的结果 二.代码说明 1.主要有两个角色 1)处理者 它能够对请求做出处理(请求得到处理则直接返回,否则传到下一个处理者),设置下一个处理者(这两个操作可以抽象出来), 同时每个处理者都有一个相应的处理级别,以及具体的处理操作(父类实现请求传递,子类实现请求处理) 2)被处理者(请求者

Java设计模式之责任链模式、职责链模式

本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 角色 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现. 具体处理者角色(ConcreteHan

JAVA设计模式之责任链模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓

Java常见设计模式之责任链模式

原文地址:  http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统