设计模式之职责链模式
时间:2022-07-22
本文章向大家介绍设计模式之职责链模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
设计模式之职责链模式
结构
说明
This pattern avoids coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. It chains the receiving objects and passes the request along the chain until an object handles it.
使多个对象都有机会处理请求, 从而避免了请求的发送者与接收者之间的耦合。 将接收对象组成链, 在链上传递请求, 直到有一个对象处理请求为止。
适用条件
- 有多个对象可以处理一个请求, 具体由哪个对象处理在运行时确定;
- 在不明确接收者的情况下, 向多个对象发送请求;
- 可处理请求的对象的集合应被动态指定。
实现
class Client {
static void Main(string[] args) {
Handler handlerChain = new ConcreteHandler1(new ConcreteHandler2(null));
Request request1 = new ConcreteRequest1();
handlerChain.HandleRequest(request1);
Request request2 = new ConcreteRequest2();
handlerChain.HandleRequest(request2);
Console.ReadKey();
}
}
public abstract class Handler {
private readonly Handler _successor;
protected Handler(Handler successor) {
this._successor = successor;
}
protected Handler Successor {
get {
return this._successor;
}
}
public abstract void HandleRequest(Request request);
}
public class ConcreteHandler1 : Handler {
public ConcreteHandler1(Handler successor) : base(successor) {
}
public override void HandleRequest(Request request) {
if (request is ConcreteRequest1) {
Console.WriteLine("ConcreteRequest1 is handled by ConcreteHandler1");
}
else {
this.Successor.HandleRequest(request);
}
}
}
public class ConcreteHandler2 : Handler {
public ConcreteHandler2(Handler successor) : base(successor) {
}
public override void HandleRequest(Request request) {
if (request is ConcreteRequest2) {
Console.WriteLine("ConcreteRequest2 is handled by ConcreteHandler2");
}
else {
this.Successor.HandleRequest(request);
}
}
}
public abstract class Request {
}
public class ConcreteRequest1 : Request {
}
public class ConcreteRequest2 : Request {
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 干掉 Navicat:正版,MySQL 官方客户端真香!
- CentOS 搭建 K8S 环境教程,一次性成功,收藏了!
- IDEA 真香!找出全部未被使用的代码只用了 2 秒钟!
- ArrayList 插入 1000w 条数据之后,我怀疑了 Java 虚拟机。。。
- 本地存储应用案例 ToDoList
- jQuery 插件
- 本周AI热点回顾:RTX3080被黄牛炒上天;百度资本助力AI 制药,已有十几位博士加入;百度联手打造AI沉浸互动展中国首秀
- 线段树
- 乘法表中第k小的数
- 数据可视化 | Pandas vs Plotnine
- laravel里使用chunk的一个坑
- 一个小小的签到功能,到底用 MySQL 还是 Redis ? ?
- 下载丨9月数据库技术通讯:Redo日志丢失,重建遭遇ORA-16433处理
- knative serving 组件分析
- 在 minikube 上部署 knative