zoukankan      html  css  js  c++  java
  • 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("服务器启动失败"))
    	}
    }
    
  • 相关阅读:
    linux unzip
    ASP.NetViewState的实现方案
    周鸿袆:从程序员创业谈起
    程序员不是神,心态决定一切
    35岁以前成功的12条黄金法则
    Web的系统测试方法 (转载)
    Assembly反射机制错误解决之道
    利用ViewState保存Html控件状态
    触发器与@@IDENTITY的
    基于SQL Server 2005新特性的分页存储过程
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14129393.html
Copyright © 2011-2022 走看看