go实现混合责任链和工厂模式demo
时间: 2023-12-06 10:03:10 浏览: 31
好的,下面是一个简单的示例代码,实现了混合责任链和工厂模式:
```go
package main
import (
"fmt"
)
// 定义一个接口,表示责任链节点
type Handler interface {
Handle(data interface{}) (interface{}, error)
}
// 定义一个具体的责任链节点
type UpperCaseHandler struct {
nextHandler Handler
}
// 实现责任链节点的处理方法
func (h *UpperCaseHandler) Handle(data interface{}) (interface{}, error) {
str, ok := data.(string)
if !ok {
return nil, fmt.Errorf("data is not a string")
}
result := fmt.Sprintf("upper case: %s", str)
if h.nextHandler != nil {
return h.nextHandler.Handle(result)
}
return result, nil
}
// 定义另一个具体的责任链节点
type LowerCaseHandler struct {
nextHandler Handler
}
// 实现责任链节点的处理方法
func (h *LowerCaseHandler) Handle(data interface{}) (interface{}, error) {
str, ok := data.(string)
if !ok {
return nil, fmt.Errorf("data is not a string")
}
result := fmt.Sprintf("lower case: %s", str)
if h.nextHandler != nil {
return h.nextHandler.Handle(result)
}
return result, nil
}
// 定义工厂方法,根据参数创建不同的责任链节点
func NewHandler(name string, nextHandler Handler) Handler {
switch name {
case "upper":
return &UpperCaseHandler{nextHandler}
case "lower":
return &LowerCaseHandler{nextHandler}
default:
return nil
}
}
func main() {
// 创建一个混合责任链
handler := NewHandler("upper", NewHandler("lower", nil))
// 处理数据
result, err := handler.Handle("Hello World")
if err != nil {
fmt.Println(err)
} else {
fmt.Println(result)
}
}
```
在上面的代码中,我们定义了一个 `Handler` 接口,表示责任链节点,具体的责任链节点实现了 `Handle` 方法,用于处理数据,并将处理结果传递给下一个节点。我们还定义了一个工厂方法 `NewHandler`,根据参数创建不同的责任链节点。在 `main` 函数中,我们创建了一个混合责任链,并用它来处理数据。