golang代理模式

62 阅读1分钟

代理模式是在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。

实现

假设在处理请求时,添加一个记录日志的功能

定义 IRequest 的接口

package main

type IRequest interface {
	handleRequest()
}

具体实现

  • 正常请求处理的类
package main

type Request struct{}

func NewRequest() *Request {
	return &Request{}
}

func (r *Request) handleRequest() {
	fmt.Println("处理请求。。。")
}

  • 加日志处理的类
package main

type LoggerRequest struct {
	req *Request
	log *log.Logger
}

func NewLoggerRequest() *LoggerRequest {
	return &LoggerRequest{
		req: NewRequest(),
		log: log.Default(),
	}
}

func (l *LoggerRequest) handleRequest() {
	l.printLogger()
	l.req.handleRequest()
}

func (l *LoggerRequest) printLogger() {
	l.log.Println("记录日志。。。")
}

客户端调用

package main

func client() {
	req := NewRequest()
	req.handleRequest()

	logReq := NewLoggerRequest()
	logReq.handleRequest()
}

总结

平时的开发中,加日志一般不会这么用。但如果我们引入了其他第三方包,无权更改别人的代码,又希望在其基础上添加自己想用的功能,那么可以使用代理模式来扩展原始类的功能,比如:rpc,缓存,日志,请求处理等。。。