控制器模式 (Controller Pattern)
控制器模式(Controller Pattern)是一种用于将用户请求(input)转换为相应的响应(response)的软件设计模式。在 Web 应用程序中,控制器模式通常用于将用户请求转发给相应的处理程序,以及将处理程序的响应返回给用户。下面是使用 Go 语言实现控制器模式的示例代码和中文注释:
package main
import (
"fmt"
)
// Controller 定义一个控制器接口,包含一个处理请求的方法
type Controller interface {
HandleRequest(request Request) Response
}
// Request 定义一个请求结构体,包含请求相关的信息
type Request struct {
Path string
Method string
Payload []byte
}
// Response 定义一个响应结构体,包含响应相关的信息
type Response struct {
StatusCode int
Headers map[string]string
Body []byte
}
// Router 定义一个路由器结构体,用于将请求映射到相应的控制器
type Router struct {
controllers map[string]Controller
}
// AddController 添加一个控制器到路由器中
func (r *Router) AddController(path string, c Controller) {
r.controllers[path] = c
}
// HandleRequest 根据请求路径找到相应的控制器,并调用它的处理方法处理请求
func (r *Router) HandleRequest(request Request) Response {
controller, ok := r.controllers[request.Path]
if !ok {
// 如果请求路径没有对应的控制器,则返回 404 错误
return Response{StatusCode: 404}
}
// 调用控制器的处理方法,并返回响应
return controller.HandleRequest(request)
}
// ExampleController 定义一个示例控制器,用于处理特定请求路径的请求
type ExampleController struct{}
// HandleRequest 实现控制器接口中的处理方法
func (c ExampleController) HandleRequest(request Request) Response {
// 处理请求的逻辑
return Response{StatusCode: 200, Body: []byte("Hello, world!")}
}
func main() {
// 创建一个路由器实例,并添加示例控制器
router := &Router{controllers: make(map[string]Controller)}
router.AddController("/example", ExampleController{})
// 模拟一个请求
request := Request{
Path: "/example",
Method: "GET",
Payload: nil,
}
// 处理请求,并打印响应
response := router.HandleRequest(request)
fmt.Println(response)
}
在上面的示例中,我们首先定义了一个控制器接口 Controller
,其中包含一个处理请求的方法 HandleRequest
。然后,我们定义了一个请求结构体 Request
,包含请求相关的信息,以及一个响应结构体 Response
,包含响应相关的信息。接下来,我们定义了一个路由器结构体 Router
,用于将请求映射到相应的控制器。在路由器结构体中,我们定义了一个 AddController
方法,用于将控制器添加到路由器中,以及一个 HandleRequest
方法,用于根据请求路径找到相应的控制器,并调用它的处理方法处理请求。
接下来,我们定义了一个示例控制器 ExampleController
,它实现了控制器接口中的处理方法。在处理方法中,我们可以根据请求做出相应的逻辑处理,并返回一个响应。
最后,在 main
函数中,我们创建了一个路由器实例,并添加了示例控制器。然后,我们模拟了一个请求,并将其传递给路由器的 HandleRequest
方法来处理。最后,我们打印出返回的响应结果。
总之,控制器模式可以帮助我们将请求与处理程序分离,从而使代码更加模块化和易于维护。在 Go 语言中,我们可以通过定义接口和结构体来实现控制器模式,并使用路由器将请求映射到相应的控制器。
推荐文章: