asia域名发布网站,做网站优化如何写方案,教你做面食的网站,网站的组织与风格设计文章目录 1 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1 概念
责任链#xff08;Chain of Responsibility#xff09;是指将客户端请求处理的不同职责对象组成请求处理链。 客户端只需要将请求交付到该链上#xff0c;而不需要关心链上含有哪些对象。请求… 文章目录 1 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1 概念
责任链Chain of Responsibility是指将客户端请求处理的不同职责对象组成请求处理链。 客户端只需要将请求交付到该链上而不需要关心链上含有哪些对象。请求处理链上的对象收到请求后执行自身业务职责并将该请求传递到下一个链节点。由于客户端不需要了解责任链上节点对象的具体类型大大降低了客户端与请求处理对象之间的耦合度。 1.1 角色
抽象处理者Handler包含抽象处理方法和一个后续处理者。 具体处理者ConcreteHandler实现抽象处理者的处理方法。 请求发送者Client向处理者发送请求。
1.2 类图 #mermaid-svg-2ykADgtH0sAQ5jQ5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .error-icon{fill:#552222;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .marker.cross{stroke:#333333;}#mermaid-svg-2ykADgtH0sAQ5jQ5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2ykADgtH0sAQ5jQ5 g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-2ykADgtH0sAQ5jQ5 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .nodeLabel,#mermaid-svg-2ykADgtH0sAQ5jQ5 .edgeLabel{color:#131300;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .label text{fill:#131300;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .classTitle{font-weight:bolder;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .node rect,#mermaid-svg-2ykADgtH0sAQ5jQ5 .node circle,#mermaid-svg-2ykADgtH0sAQ5jQ5 .node ellipse,#mermaid-svg-2ykADgtH0sAQ5jQ5 .node polygon,#mermaid-svg-2ykADgtH0sAQ5jQ5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-2ykADgtH0sAQ5jQ5 g.clickable{cursor:pointer;}#mermaid-svg-2ykADgtH0sAQ5jQ5 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-2ykADgtH0sAQ5jQ5 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .dashed-line{stroke-dasharray:3;}#mermaid-svg-2ykADgtH0sAQ5jQ5 #compositionStart,#mermaid-svg-2ykADgtH0sAQ5jQ5 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-2ykADgtH0sAQ5jQ5 #compositionEnd,#mermaid-svg-2ykADgtH0sAQ5jQ5 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-2ykADgtH0sAQ5jQ5 #dependencyStart,#mermaid-svg-2ykADgtH0sAQ5jQ5 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-2ykADgtH0sAQ5jQ5 #dependencyStart,#mermaid-svg-2ykADgtH0sAQ5jQ5 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-2ykADgtH0sAQ5jQ5 #extensionStart,#mermaid-svg-2ykADgtH0sAQ5jQ5 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-2ykADgtH0sAQ5jQ5 #extensionEnd,#mermaid-svg-2ykADgtH0sAQ5jQ5 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-2ykADgtH0sAQ5jQ5 #aggregationStart,#mermaid-svg-2ykADgtH0sAQ5jQ5 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-2ykADgtH0sAQ5jQ5 #aggregationEnd,#mermaid-svg-2ykADgtH0sAQ5jQ5 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-2ykADgtH0sAQ5jQ5 .edgeTerminals{font-size:11px;}#mermaid-svg-2ykADgtH0sAQ5jQ5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Client Handler #successor:Handler handleRequest(request:Request) ConcreteHandlerA handleRequest(request:Request) ConcreteHandlerB handleRequest(request:Request) 2. 代码示例
2.1 设计
定义一个抽象处理者Handler定义实际处理者ConcreteHandlerA、ConcreteHandlerB 它们实现了抽象处理者Handler它继承了另一个处理者下一个处理者它的Option()方法执行它的责任它的handleRequest()方法组装责任链并执行它的责任 调用 实例化三个实际处理者使用handleRequest()方法执行责任链
2.2 代码
package mainimport (fmt
)// 定义抽象处理者
type Handler interface {handleRequest() string
}// 定义实际处理者A
type ConcreteHandlerA struct {name stringnext Handler
}
//定义一个方法模拟实际处理者A的处理过程
func (c *ConcreteHandlerA) Option() {fmt.Println(执行 c.name)
}
//定义一个方法完成它的处理后交给下一个实际处理者
func (c *ConcreteHandlerA) handleRequest() string {c.Option()if c.next ! nil {return c.next.handleRequest()}return
}// 定义实际处理者B情况和A相同
type ConcreteHandlerB struct {name stringnext Handler
}func (c *ConcreteHandlerB) Option() {fmt.Println(执行 c.name)
}func (c *ConcreteHandlerB) handleRequest() string {c.Option()if c.next ! nil {return c.next.handleRequest()}return
}//定义一个函数生产处理者
func NewHandler(name string, next Handler, kind string) (handler Handler, err error) {switch kind {case A:handler ConcreteHandlerA{name: name,next: next,}return handler, nilcase B:handler ConcreteHandlerB{name: name,next: next,}return handler, nildefault:return nil, err}}func main() {//实例化3个实际处理者handlerA1, _ : NewHandler(handlerA1, nil, A)handlerA2, _ : NewHandler(handlerA2, handlerA1, A)handlerB1, _ : NewHandler(handlerB1, handlerA2, B)//使用handleRequest方法依次处理处理过程我们不可见但是可以通断点过调试看到r : handlerB1.handleRequest()fmt.Println(r)
}
执行结果
执行handlerB1
执行handlerA2
执行handlerA12.3 类图 #mermaid-svg-58ZQMFgWOLIO6lOi {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-58ZQMFgWOLIO6lOi .error-icon{fill:#552222;}#mermaid-svg-58ZQMFgWOLIO6lOi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-58ZQMFgWOLIO6lOi .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-58ZQMFgWOLIO6lOi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-58ZQMFgWOLIO6lOi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-58ZQMFgWOLIO6lOi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-58ZQMFgWOLIO6lOi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-58ZQMFgWOLIO6lOi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-58ZQMFgWOLIO6lOi .marker.cross{stroke:#333333;}#mermaid-svg-58ZQMFgWOLIO6lOi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-58ZQMFgWOLIO6lOi g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-58ZQMFgWOLIO6lOi g.classGroup text .title{font-weight:bolder;}#mermaid-svg-58ZQMFgWOLIO6lOi .nodeLabel,#mermaid-svg-58ZQMFgWOLIO6lOi .edgeLabel{color:#131300;}#mermaid-svg-58ZQMFgWOLIO6lOi .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-58ZQMFgWOLIO6lOi .label text{fill:#131300;}#mermaid-svg-58ZQMFgWOLIO6lOi .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-58ZQMFgWOLIO6lOi .classTitle{font-weight:bolder;}#mermaid-svg-58ZQMFgWOLIO6lOi .node rect,#mermaid-svg-58ZQMFgWOLIO6lOi .node circle,#mermaid-svg-58ZQMFgWOLIO6lOi .node ellipse,#mermaid-svg-58ZQMFgWOLIO6lOi .node polygon,#mermaid-svg-58ZQMFgWOLIO6lOi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-58ZQMFgWOLIO6lOi .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-58ZQMFgWOLIO6lOi g.clickable{cursor:pointer;}#mermaid-svg-58ZQMFgWOLIO6lOi g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-58ZQMFgWOLIO6lOi g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-58ZQMFgWOLIO6lOi .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-58ZQMFgWOLIO6lOi .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-58ZQMFgWOLIO6lOi .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-58ZQMFgWOLIO6lOi .dashed-line{stroke-dasharray:3;}#mermaid-svg-58ZQMFgWOLIO6lOi #compositionStart,#mermaid-svg-58ZQMFgWOLIO6lOi .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-58ZQMFgWOLIO6lOi #compositionEnd,#mermaid-svg-58ZQMFgWOLIO6lOi .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-58ZQMFgWOLIO6lOi #dependencyStart,#mermaid-svg-58ZQMFgWOLIO6lOi .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-58ZQMFgWOLIO6lOi #dependencyStart,#mermaid-svg-58ZQMFgWOLIO6lOi .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-58ZQMFgWOLIO6lOi #extensionStart,#mermaid-svg-58ZQMFgWOLIO6lOi .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-58ZQMFgWOLIO6lOi #extensionEnd,#mermaid-svg-58ZQMFgWOLIO6lOi .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-58ZQMFgWOLIO6lOi #aggregationStart,#mermaid-svg-58ZQMFgWOLIO6lOi .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-58ZQMFgWOLIO6lOi #aggregationEnd,#mermaid-svg-58ZQMFgWOLIO6lOi .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-58ZQMFgWOLIO6lOi .edgeTerminals{font-size:11px;}#mermaid-svg-58ZQMFgWOLIO6lOi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Client «interface» Handler handleRequest() : string ConcreteHandlerA name:string next:Handler handleRequest() : string Option() ConcreteHandlerB name:string next:Handler handleRequest() : string Option()