笔记-大话设计模式-24 职责链模式
2015-09-09 13:19
225 查看
类有太多的责任,这违背了单一职责原则,增加新的管理类别,需要修改这个类,违背了开放-封闭原则。
职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandle对象负责处理它。
接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。
Demo1:
Test:
Demo2:
Test:
职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandle对象负责处理它。
接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。
Demo1:
abstract class Handler { protected Handler successor; public void SetSuccessor(Handler successor) { this.successor = successor; } public abstract void HandleRequest(int requestLevel); }
class AHandler : Handler { public override void HandleRequest(int requestLevel) { if (requestLevel >= 0 && requestLevel < 10) { Console.WriteLine("{0}处理请求{1}", this.GetType().Name, requestLevel); } else if (successor != null) { successor.HandleRequest(requestLevel); } } }
class BHandler : Handler { public override void HandleRequest(int requestLevel) { if (requestLevel >= 10 && requestLevel < 20) { Console.WriteLine("{0}处理请求{1}", this.GetType().Name, requestLevel); } else if (successor != null) { successor.HandleRequest(requestLevel); } } }
class CHandler : Handler { public override void HandleRequest(int requestLevel) { if (requestLevel >= 20 && requestLevel < 30) { Console.WriteLine("{0}处理请求{1}", this.GetType().Name, requestLevel); } else if (successor != null) { successor.HandleRequest(requestLevel); } } }
Test:
Handler h1 = new AHandler(); Handler h2 = new BHandler(); Handler h3 = new CHandler(); h1.SetSuccessor(h2); h2.SetSuccessor(h3); int[] requests = { 0, 12, 32 }; foreach (var item in requests) { h1.HandleRequest(item); }
Demo2:
abstract class Manager { protected string name; protected Manager higher; public Manager(string name, Manager higher) { this.name = name; this.higher = higher; } public abstract void HandlerRequest(Request request); }
class CommonManager : Manager { public CommonManager(string name, Manager higher) : base(name, higher) { } public override void HandlerRequest(Request request) { if (request.Type == "请假" && request.Number <= 2) { Console.WriteLine("{0}: {1} 数量{2} 被批准", name, request.Content, request.Number); } else if (higher != null) { higher.HandlerRequest(request); } else { Console.WriteLine("{0} 驳回请求", name); } } }
class Majordomo : Manager { public Majordomo(string name, Manager higher) : base(name, higher) { } public override void HandlerRequest(Request request) { if (request.Type == "请假" && request.Number <= 5) { Console.WriteLine("{0}: {1} 数量{2} 被批准", name, request.Content, request.Number); } else if (higher != null) { higher.HandlerRequest(request); } else { Console.WriteLine("{0} 驳回请求", name); } } }
class Request { private string type; public string Type { get { return type; } set { type = value; } } private string content; public string Content { get { return content; } set { content = value; } } private int number; public int Number { get { return number; } set { number = value; } } }
Test:
Manager m1 = new CommonManager("经理", new Majordomo("总监", null)); Request r1 = new Request(); r1.Type = "请假"; r1.Content = "请假回见"; r1.Number = 6; m1.HandlerRequest(r1);
相关文章推荐
- javascript通用事件封装
- 通过输入卡号前10位数字判断是哪个银行的卡和类型(储蓄卡or信用卡)
- Lua5.0 非正式总结
- ACDream dp专题 C - 哗啦啦村的扩建
- String StringBuffer StringBuilder的区别
- IOS中图形图像处理第一部分:位图图像原图修改
- cocos2d-x注意事项(十)Lua发展飞机战争-4-创建主角
- 中国电子邮件的发展史
- Android笔记(二十三) Android中的ProgressBar(进度条)
- ALM11用例测试类型
- C#中命名空间别名的使用
- http://www.qq.com/404/
- JS 闭包
- 关于吃豆游戏的感悟
- 常用的JS-备份
- L版本GMS预置
- yii2安装 程序模板安装
- UVa 534 - Frogger
- 【原创】opencv 实现特定形状视频跟踪,图像裁剪
- POJ 3255 Roadblocks (次级短路问题)