HandleDecorator装饰器模式实践
HandleDecorator装饰器模式实践
实现记录时间的中间件,记录地址中间件
装饰模式原理
代码实现
// 中间件的实现
// 装饰模式
package main
import (
"encoding/json"
"errors"
"fmt"
"log"
"net/http"
"time"
)
// 路由的第一种形式
type Router1 struct {}
func (r1 *Router1) ServeHTTP(w http.ResponseWriter,r *http.Request) {
type Res1 struct {
Msg string
}
fmt.Println("欢迎来到路由1")
res := &Res1{Msg:"hello router 1"}
marshal, _ := json.Marshal(res)
w.Write(marshal)
}
// 路由的第二种形式
func Router2() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("欢迎来到路由2")
type Res2 struct {
Msg string
}
res2 := &Res2{Msg:"touter2"}
marshal, _ := json.Marshal(res2)
w.Write(marshal)
})
}
func Router5(w http.ResponseWriter, r *http.Request) {
type Res5 struct {
Msg string
}
fmt.Println("欢迎来到路由5")
res := &Res5{Msg:"hello router 5"}
marshal, _ := json.Marshal(res)
w.Write(marshal)
}
// 时间记录中间件
func traceTime(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println("时间记录中间件")
t := time.Now()
next.ServeHTTP(w, r)
since := time.Since(t)
log.Println("路由运行时间为", since)
})
}
// 地址记录中间件
func tranceUrl(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println("访问地址记录中间件")
next.ServeHTTP(w, r)
log.Println("访问地址为", r.URL.String())
})
}
func main() {
http.Handle("/router1", new(Router1))
http.Handle("/router2", Router2())
// 第三种路由
handler3 := func(http.ResponseWriter, *http.Request) {
type Res3 struct {
Msg string
}
fmt.Println("欢迎来到路由3")
//res := &Res3{Msg:"hello router 3"}
//marshal, _ := json.Marshal(res)
//w.Write(marshal)
}
http.HandleFunc("/router3", handler3)
http.HandleFunc("/router4", func(w http.ResponseWriter, r *http.Request) {
type Res4 struct {
Msg string
}
fmt.Println("欢迎来到路由4")
res := &Res4{Msg:"hello router 4"}
marshal, _ := json.Marshal(res)
w.Write(marshal)
})
http.HandleFunc("/router5", Router5)
http.Handle("/router6", traceTime(tranceUrl(new(Router1))))
http.Handle("/router7", traceTime(tranceUrl(Router2())))
err := http.ListenAndServe(":9000", nil)
if err != nil {
log.Println(err, errors.New("服务器启动失败"))
}
}