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) 在软件构建过程中,一个请 ...
随机推荐
- Cross-Site Scripting:Persistent 跨站点脚本:持久性
- UWP 利用VisualTreeHelper查找页面中的元素
一般我们在展示数据的时候,都会采用DataTemplate的预先设置数据模板,再使用Set ItemsSource的方式进行数据绑定 这样就能满足大部分的需求. 不过有时候需要对页面已经展示出来的元素 ...
- 精通awk系列(6):awk命令结构和awk语法结构
回到: Linux系列文章 Shell系列文章 Awk系列文章 awk命令行结构和语法结构 awk命令行结构 awk [ -- ] program-text file ... (1) awk -f p ...
- Ajax异步按下回车提交表单
作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 html <form id="findInvis"> 帖子标题: <input title="请输入 ...
- Java每日一面(Part1:计算机网络)[19/11/13]
作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1. HTTP相关[1] 1.1 HTTP简介 HTTP协议,即超文本传输协议,属于应用层的协议,他是基于请求和响应模式的无状态的 应用层协议. ...
- UML简单介绍—类图这么看就懂了
如何看懂类图 1.类图简介 描述类的内部结构和类与类之间的关系,是一种静态结构图. 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关 ...
- JDK新特性关于流操作部分
// array 工具类 可以用来快捷的将数组转化为list List<String> strings = Arrays.asList("zhongguo", &quo ...
- C lang:Protect array data——Const
Xx_Introduction Use pointer translate parameter array original data will change data,and use const p ...
- 与用户xxx一起提供的密码不正确。请确认输入的密码正确并重试
环境: SharePoint 2010 / 2013 以系统账户身份登录管理中心,然后创建Web Application,报: 与用户xxx一起提供的密码不正确.请确认输入的密码正确并重试 明明都已经 ...
- pyecharts绘制地图
python 绘制地图 环境准备 1.1 安装必备绘画库 亲身体验,最新版的pyecharts使用不来,通过百度寻得的教学推荐版本 0.1.9.4 可以绘制完成世界地图,国家地图以及市级地图,但是不能 ...