第22章 职责链模式(Chain of Responsibility)

原文 第22章 职责链模式(Chain of Responsibility)

职责链模式

 

     导读:职责链模式是一个既简单又复杂的设计模式,刚开始学习这个设计模式的时候光示例都看了好几遍。就为了理清里面的逻辑走向。是个值得慢慢品味的设计模式

 

     概述:

 

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

 

     结构图:

 

 

     代码举例:公司请假

 


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

  /// <summary>

    /// 请求类 场景

    /// </summary>

    class Context

    {

        public Context(int day)

        {

            this.day = day;

        }

        private int day;

 

        public int Day

        {

            get return day; }

            set { day = value; }

        }

 

    }

    /// <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);

    }

    /// <summary>

    /// 部门经理 2天以下的部门签字就成了

    /// 

    /// </summary>

    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>

    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>

    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);

        }

    }

客户端调用


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

    class Program

    {

        static void Main(string[] args)

        {

            Context context = new Context(3);

            Handler manager = new Manager("部门经理");

            Handler gmanager = new GeneralManager("总经理");

              Handler president = new President("董事长");

            manager.handler = gmanager;

            gmanager.handler = president;

            manager.Pass(context);

            Console.ReadLine();

           

 

        }

    }

 

     适用场景:

 

     1、当一个方法的传入参数将成为分支语句的判断条件时;
     2、当每一个分支的职责相对独立,且逻辑较为复杂时;
     3、当分支条件存在扩展的可能时。

 

     设计模式系列文章入口:http://www.diyibk.com/post/39.html

时间: 2024-11-03 20:48:45

第22章 职责链模式(Chain of Responsibility)的相关文章

设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述        你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,并且沿着这条链传递请求,直到有(部门)对象处理它为止. 例子1:js的事件浮升机制 例子2: 2.问题

职责链模式(chain of responsibility)

原文地址 一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所以希望各位多多指教. 二. 什么是链 文章伊始,先让我们了解这个最基本的概念,什么是链. 我给链下了这样的定义: 链是一系列节点的集合. 链的各节点可灵活拆分再重组. 三. 何为职责链 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链

重温设计模式(三)——职责链模式(chain of responsibility)

一.写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所以希望各位多多指教. 二.什么是链 文章伊始,先让我们了解这个最基本的概念,什么是链. 我给链下了这样的定义: 1.链是一系列节点的集合. 2.链的各节点可灵活拆分再重组. 三.何为职责链 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着

乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) 作者:webabcd 介绍 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它. 示例 有一个Message实体类,某个类对它的操作有Insert()方法.现在要求根据插

php Chain of Responsibility 职责链模式

比如一颗原子弹投下的瞬间,在杀伤范围内的部队或者建筑都会减少血,但是随着距离中心点的远近,受损程度是不同的,而且不同的兵种和建筑受损情况是不同的. 待解决的问题:原子弹投下的瞬间,将杀伤的处理分别交给杀伤范围内的部队或者建筑自己的方法处理. 思路:建立一个接口,让所有的部队或者建筑实现.   职责链模式(Chain of Responsibility)示例:  代码如下 复制代码 <?php //被原子弹攻击的接口 interface NuclearAttacked {     //处理被原子弹

设计模式学习笔记(十九)—Chain of Responsibility职责链模式

由于本人水平有限,写出来的东西也许对初学者有所帮助.如果不小心哪位大侠看了不要见笑,哪里有不正确的地方还请批评指正.好了不说废话了. Chain of Responsibility模式定义: 为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 我的理解: 在不止一个对象可以处理客户端请求的时候,为了使每个对象都有处理请求的机会,把这些对象顺序地串联起来形成一个链,每个被串联的对象都有一个指向下一个对

php设计模式 Chain Of Responsibility (职责链模式)

复制代码 代码如下: <?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * */ abstract class Handler { protected $_handler = null; public function setSuccessor($handler) { $this->_handler = $handler; } abstract functio

php设计模式 Chain Of Responsibility (职责链模式)_php技巧

复制代码 代码如下: <?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * */ abstract class Handler { protected $_handler = null; public function setSuccessor($handler) { $this->_handler = $handler; } abstract functio

基于.NET的职责链模式类库——NChain

Chain.NET(又名NChain)是职责链模式在.NET和Mono平台上的一个实现.它的0.1版本(已可以在SourceForge中访问)结合了标准的职责链模式以及命令模式,目的是"为基于命令处理的功能提供一个方便而又灵活的解决方案". NChain松散地基于Java平台上的Jakarta的Commons Chain包.一般说来,职责链模式从一系列处理单元中分解出命令对象从而解耦.每个处理单元均包含相应的代码,以描述它可接受的命令对象的类型:另外它还会委托部分责任,用来处理与职责链