原文 第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

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

  1. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...

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

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  3. 职责链模式(Chain of Responsibility)(对象行为型)

    1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...

  4. 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

    责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...

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

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...

  6. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 行为型设计模式之职责链模式(Chain of Responsibility)

    结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个 ...

  8. 职责链模式(chain of responsibility)

    一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...

  9. 职责链模式(chain of responsibility Pattern)

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

随机推荐

  1. Xamarin.Android 在VS下调试时提示 In mgmain JNI_OnLoad 程序“Mono”已退出 解决办法

    原因是使用了破解版的 Xamarin,调试时不能使用共享库

  2. MSSQL连接字符串,你真的清楚吗?

    原文:MSSQL连接字符串,你真的清楚吗? 几年前当我第一次面试时,考官发现我是个新手于是他让我写个连接字符串,虽然当时就知道X种连接字符串的写法,但是当时却没能写对一个,工作多年后我仍然不能写一个正 ...

  3. jquery 判断当前上传文件大小限制上传格式 搭配thinkphp实现上传即预览(模拟异步上传)

    在web开发中,最纠结的一项就是文件上传,最近由于项目需要前后摸索了四天在这里分享给大家.如有不足,望指出!! 前台:jquery.easyui.html 后台:thinkphp 主要涉及语言:jqu ...

  4. DS-5/RVDS4.0变量初始化错误

    最近总是有各种调试时的错误,内存错误一般,我无意中发现的所有全局变量失败,也就是说,全局变量声明之后,颂值早期值误. 初值明明是0x12345674,最后变为了0xBA141234,出现了移位现象 測 ...

  5. Swift学习资料

    http://www.hangge.com/blog/cache/category_72_1.html

  6. 构造函数为什么不能为虚函数 &amp; 基类的析构函数为什么要为虚函数

    一.构造函数为什么不能为虚函数 1. 从存储空间角度,虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的.问题出来了,假设构造函数 ...

  7. CacheManager

    .Net缓存管理框架CacheManager Cache缓存在计算机领域是一个被普遍使用的概念.硬件中CPU有一级缓存,二级缓存, 浏览器中有缓存,软件开发中也有分布式缓存memcache, redi ...

  8. uitextField单词的方法和抖动的限制

    这种方法还可以找到在线. 如下面的详细信息: .h文件 #import <UIKit/UIKit.h> @interface UITextField (LimitLength) /** * ...

  9. HDOJ 5000 Clone

    所有的属性,以满足一定的条件,是,财产和等于sum/2结果最大. Clone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536 ...

  10. C++生产和使用的临时对象

     所谓暂时对象就是一种无名对象. 它的出现假设不在程序猿的预期之下(比如不论什么pass by value操作都会引发copy操作,于是形成一个暂时对象),往往照成效率上的负担. 但有时候能够制造 ...