go语言设计模式之Chain Of Responsibility(责任链)
ChainOfResponsibility.go
package ChainOfResponsibility
import (
"fmt"
"io"
"strings"
)
type ChainLogger interface {
Next(string)
}
type FirstLogger struct {
NextChain ChainLogger
}
func (f *FirstLogger) Next(s string) {
fmt.Printf("First logger: %s\n", s)
if f.NextChain != nil {
f.NextChain.Next(s)
}
}
type SecondLogger struct {
NextChain ChainLogger
}
func (se *SecondLogger) Next(s string) {
if strings.Contains(strings.ToLower(s), "hello") {
fmt.Printf("Second logger: %s\n", s)
if se.NextChain != nil {
se.NextChain.Next(s)
}
return
}
fmt.Printf("Finishing in second logging\n\n")
}
type WriterLogger struct {
NextChain ChainLogger
Writer io.Writer
}
func (w *WriterLogger) Next(s string) {
if w.Writer != nil {
w.Writer.Write([]byte("WriterLogger: " + s))
}
if w.NextChain != nil {
w.NextChain.Next(s)
}
}
ChainOfResponsibility_test.go
package ChainOfResponsibility
import (
"fmt"
"strings"
"testing"
)
type myTestWriter struct {
receivedMessage *string
}
func (m *myTestWriter) Write(p []byte) (int, error) {
if m.receivedMessage == nil {
m.receivedMessage = new(string)
}
tempMessage := fmt.Sprintf("%p%s", m.receivedMessage, p)
m.receivedMessage = &tempMessage
return len(p), nil
}
func (m *myTestWriter) Next(s string) {
m.Write([]byte(s))
}
func TestCreateDefaultChain(t *testing.T) {
myWriter := myTestWriter{}
writerLogger := WriterLogger{Writer: &myWriter}
second := SecondLogger{NextChain: &writerLogger}
chain := FirstLogger{NextChain: &second}
t.Run("3 loggers, 2 of them writes to console, second only if it founds"+
"the world 'hello', third writes to some variable if second found 'hello'",
func(t *testing.T) {
chain.Next("message that breaks the chain\n")
if myWriter.receivedMessage != nil {
t.Error("Last link should not receive any message")
}
chain.Next("Hello\n")
if *myWriter.receivedMessage == "" ||
!strings.Contains(*myWriter.receivedMessage, "Hello") {
t.Fatal("Last link did not received expected message")
}
})
}

go语言设计模式之Chain Of Responsibility(责任链)的更多相关文章
- 设计模式(13)--Chain of Responsibility(责任链模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...
- python 设计模式之 (Chain of Responsibility)责任链模式
#写在前面 对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的.所以弄明白很重要. 等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场 #责任链模式定义 简书上一网友就把这个定义 ...
- 设计模式(一)Chain Of Responsibility责任链模式
设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser { ...
- 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)
17.1.解释 概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. main(),客户 IWom ...
- Chain of Responsibility 责任链模式
简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其[下家]的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...
- Chain of Responsibility 责任链模式 MD
责任链模式 简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户 ...
- Chain of Responsibility - 责任链模式
定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合度. 案例 比方如今有一个图形界面,它包含一个应用Application类,一个主窗体Window,一个buttonButton ...
- 14、Cahin of Responsibility 责任链 COR设计模式
1.责任链模式 chain of responsibility 责任链模式 责任链,顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某 ...
- 设计模式19:Chain Of Responsibility 职责链模式(行为型模式)
Chain Of Responsibility 职责链模式(行为型模式) 请求的发送者与接受者 某些对象请求的接受者可能有多种多样,变化无常…… 动机(Motivation) 在软件构建过程中,一个请 ...
随机推荐
- report framework
大标题 摘要: 关键字: 1 第一题:(爬虫) 1.1 问题分析及解题思路 本题需要爬取xxxx的数据,运用Python的Request爬虫框架 1.2 解题流程及代码 1.2.1定义爬虫类-构造函数 ...
- sharepoint2010 部署到Windows server 2012 R2服务器遇到的问题
最近由于客户服务器升级到windows server2012 R2 版本,生产环境需要相应升级. 查看很多资料,服务器升级到windows server2012 R2 版本,sharepoint要升级 ...
- Dynamics CRM通过定制应用程序功能区为符合条件的实体表单增加按钮
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复167或者20151029可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 前面的博文都是为一个实体添加按钮 ...
- 史上最全Oracle数据泵常用命令
本文转自https://blog.csdn.net/Enmotech/article/details/102848825 墨墨导读:expdp和impdp是oracle数据库之间移动数据的工具,本文简 ...
- admin配置与Mysql数据库连接
admin配置管理数据库的框架:web版的数据库管理页面初始化数据库: python manage.py makemigrations python manage.py migrate启动项目:(创建 ...
- Flink| 运行架构
1. Flink运行时组件 作业管理器(JobManager) 任务管理器(TaskManager) 资源管理器(ResourceManager) 分发器(Dispatcher) 2. 任务提交流程 ...
- Redux Class(immutable Record)引入的必要性 && Navigation引入方式
我的意见 和大家讨论一下几个问题 1. 项目里面没有用class规定的请求数据结构,调试数据的时候无法从前端获取请求的数据格式,要看后端接口,增加了调试的难度.我们以前会用immutable Reco ...
- 运维工具ansible-使用与介绍(转)
转自 Linux轻量级自动运维工具-Ansible浅析 - ~微风~ - 51CTO技术博客http://weiweidefeng.blog.51cto.com/1957995/1895261 Ans ...
- Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the connection string near ';characterEncoding=UTF
今天在使用springboot整合SSM的时候,配置好以后启动项目,报了一个这样的异常 java.sql.SQLNonTransientConnectionException: Cannot load ...
- LinAlgError: Last 2 dimensions of the array must be square
python 矩阵计算时出现错误 此时如果矩阵不是方阵,就会出现如下错误: 这里值得注意的是:当我们这样使用的时候,程序运行又会很正常: 貌似我们求得了非方阵的逆. 下面我们来验证一下: 仔细一看,这 ...