C#设计模式17——责任链模式的写法
是什么:
责任链模式是一种行为型设计模式,它允许对象组成一个链并依次检查另一个对象是否可以处理请求。如果一个对象可以处理请求,它处理请求,并且负责将请求传递给下一个对象,直到请求被处理为止。
为什么:
责任链模式可以降低系统中对象之间的耦合度,并提高系统的灵活性和可维护性。同时,它还可以减少了客户端与各个处理对象的耦合,使得客户端不需要知道哪个具体的处理对象来处理请求。
怎么做:
在责任链模式中,我们定义了一个抽象处理者接口 Handler,它定义了处理请求的方法 HandleRequest,并持有一个对下一个处理者的引用。接下来,我们定义了一些具体的处理者类 ConcreteHandlerA,ConcreteHandlerB 等,并实现了 Handler 接口中的 HandleRequest 方法。在具体实现中,每个处理者对象都能判断自己是否具备处理该请求的能力,如果能够处理,则直接处理;如果不能处理,则将请求转发给下一个处理者对象。如果到了链的末端,即没有任何一个处理者对象能够处理该请求,则该请求会被默认处理或者被丢弃。
下面是在 C# 语言中实现责任链模式的一个示例代码:
// 抽象处理者
public abstract class Handler
{
protected Handler nextHandler; // 持有对下一个处理者的引用
public void SetNextHandler(Handler nextHandler)
{
this.nextHandler = nextHandler;
}
public abstract void HandleRequest(int request);
}
// 具体处理者 A
public class ConcreteHandlerA : Handler
{
public override void HandleRequest(int request)
{
if (request >= 0 && request <= 10)
{
Console.WriteLine("ConcreteHandlerA 处理请求: " + request);
}
else if (nextHandler != null)
{
nextHandler.HandleRequest(request);
}
else
{
Console.WriteLine("无法处理请求: " + request);
}
}
}
// 具体处理者 B
public class ConcreteHandlerB : Handler
{
public override void HandleRequest(int request)
{
if (request >= 11 && request <= 20)
{
Console.WriteLine("ConcreteHandlerB 处理请求: " + request);
}
else if (nextHandler != null)
{
nextHandler.HandleRequest(request);
}
else
{
Console.WriteLine("无法处理请求: " + request);
}
}
}
// 具体处理者 C
public class ConcreteHandlerC : Handler
{
public override void HandleRequest(int request)
{
if (request >= 21 && request <= 30)
{
Console.WriteLine("ConcreteHandlerC 处理请求: " + request);
}
else if (nextHandler != null)
{
nextHandler.HandleRequest(request);
}
else
{
Console.WriteLine("无法处理请求: " + request);
}
}
}
在这个代码示例中,我们定义了一个抽象处理者 Handler,并在其中定义了一个对下一个处理者的引用 nextHandler。接下来,我们定义了三个具体处理者 ConcreteHandlerA,ConcreteHandlerB 和 ConcreteHandlerC,并实现了 Handler 接口中的 HandleRequest 方法。在 HandleRequest 方法中,每个具体处理者对象都会根据自己的能力判断是否能够处理该请求,如果能够处理,则直接处理;否则将请求转发给下一个处理者对象。
何时使用:
当一个系统需要处理一些请求,并且每个请求可以有多个处理者对象可以处理时,可以考虑采用责任链模式。此外,责任链模式还适用于系统中的对象具有强耦合关系时,将其解耦可以提高系统的灵活性和可维护性。
C#设计模式17——责任链模式的写法的更多相关文章
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- php设计模式之责任链模式
php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...
- python设计模式之责任链模式
python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...
- 详解java设计模式之责任链模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...
- 【GOF23设计模式】责任链模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 package com.test.chainO ...
- C#设计模式:责任链模式
设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...
- Head First设计模式之责任链模式
一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求 ...
- 【Unity与23种设计模式】责任链模式(Chain of Responsibility)
GoF中定义: "让一群对象都有机会来处理一项请求,以减少请求发送者与接收者之间的耦合度.将所有的接受对象串联起来,让请求沿着串接传递,直到有一个对象可以处理为止." 举个现实中的 ...
- Java进阶篇设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
- 设计模式之责任链模式——Java语言描述
责任链模式为请求创建了一个接受者对象的链.这种模式给予请求的类型,对请求的发送者和接受者进行解耦.这种类型的设计模式属于行为模式.在这种模式下,通常每个接收者都包含对另一个接收者的引用.如果一个对象不 ...
随机推荐
- 微服务项目-小Q视频网
1.后台管理系统(更新中...) (1)讲师列表 (2)添加讲师 (3)导入课程分类 (4)课程分类列表 其他功能就不一一截图了,后台详细功能如下 2.前台会员系统(更新中...) (1)前台的技术栈 ...
- 华企盾DSC苹果Mac针对Word编辑文件不加密
解决方法:查看了客户端的控制台日志显示的进程名和加密后缀都正常,可能文件内部有rename的操作,加密所有类型解决
- python tkinter使用(四)
python tkinter使用(四) 本篇文章主要讲下tkinter 的文本框相关. tkinter中用Entry来实现输入框,类似于android中的edittext. 具体的用法如下: 1:空白 ...
- 本地tomcat设置外网访问
将host name中的localhost修改为自己电脑的IP地址,具体的IP地址可以在控制面板的网络和共享中心中进行查看, 打开tomcat的conf文件夹下的server.xml文件,将local ...
- Guava Cache 异步刷新技巧,你值得拥有!
Guava Cache是一款非常优秀的本地缓存框架,提供简洁易用的 API 供开发者使用. 这篇文章,我们聊聊如何使用 Guava Cache 异步刷新技巧带飞系统性能 . 1 基本用法 首先,在 J ...
- libGDX游戏开发之AssetManager资源管理(十)
libGDX游戏开发之AssetManager资源管理(十) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情 ...
- libGDX游戏开发之菜单界面(四)
libGDX游戏开发之菜单界面(四) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和googl ...
- react路由权限v6
方法 1.模拟vue的路由拦截(未尝试) 2.进入页面拦截(模拟后台管理系统) route v6常用属性 页面梳理 路由表 公共路由 权限路由 layout(+权限判定) 登录 页面布局 路由表 点击 ...
- 电商业务容器化遇瓶颈,公有云Docker镜像P2P加速很安全
当前,电商平台会采用基于Docker的容器技术来承载618大促期间的一些关键业务版块,包括最简单的商品图片展示.订单详情页面等等. 通过容器化改造,电商平台的每个业务版块解耦,可以独立开发.部署和上线 ...
- 云小课|RDS for MySQL参数模板一键导入导出,参数配置轻松搞定
摘要:云数据库RDS for MySQL支持参数模板的导入和导出功能. 本文分享自华为云社区<[云小课][第56课]RDS for MySQL参数模板一键导入导出,参数配置轻松搞定>,作者 ...