代理模式
是在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
实现
假设在处理请求时,添加一个记录日志的功能
定义 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,缓存,日志,请求处理等。。。