控制器模式(Controller Pattern)广泛用于 Web 开发和软件架构设计中,尤其是在 MVC(Model-View-Controller)架构中。它的主要作用是负责处理用户的输入,调用模型来处理数据,并将结果反馈给视图进行展示。它解耦了用户接口和业务逻辑,使得代码结构更加清晰、易于维护。
一、主要组成部分
控制器模式的主要思想是通过引入一个控制器(Controller)来管理应用的请求流和业务逻辑。这种模式下,表示层(View)和业务逻辑层(Model)都通过控制器来交互,彼此间没有直接通信。
- Model:负责管理数据和业务逻辑,包含应用的状态和变更逻辑。
- View:负责呈现数据,并将用户的交互传递给控制器。
- Controller:负责接收用户输入、操作数据模型并决定显示什么内容给用户。
在控制器模式中,控制器从视图层接收输入,调用模型层中的逻辑处理业务需求,并返回处理结果给视图层。这样可以保持模型、视图和控制器三者之间的独立性。
二、 举例
假设构建一个简单的用户管理 API,控制器负责处理用户输入,操作模型,并返回响应。
- Model:定义用户数据结构和处理逻辑。
package models
type User struct {
ID int
Name string
}
var users = []User{
{ID: 1, Name: "Alice"},
{ID: 2, Name: "Bob"},
}
func GetAllUsers() []User {
return users
}
func GetUserByID(id int) *User {
for _, user := range users {
if user.ID == id {
return &user
}
}
return nil
}
- Controller:控制器处理请求并调用模型逻辑。
package controllers
import (
"encoding/json"
"net/http"
"strconv"
"myapp/models"
)
func GetUsers(w http.ResponseWriter, r *http.Request) {
users := models.GetAllUsers()
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(users)
}
func GetUser(w http.ResponseWriter, r *http.Request) {
idStr := r.URL.Query().Get("id")
id, err := strconv.Atoi(idStr)
if err != nil || id <= 0 {
http.Error(w, "Invalid user ID", http.StatusBadRequest)
return
}
user := models.GetUserByID(id)
if user == nil {
http.Error(w, "User not found", http.StatusNotFound)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(user)
}
View:在 web 应用中,视图通常是用户浏览器或 API 客户端,它通过 HTTP 请求与控制器交互,控制器根据业务逻辑返回 JSON 或 HTML 响应。
Main 程序:在主程序中注册路由并启动服务。
package main
import (
"net/http"
"myapp/controllers"
)
func main() {
http.HandleFunc("/users", controllers.GetUsers)
http.HandleFunc("/user", controllers.GetUser)
http.ListenAndServe(":8080", nil)
}