// Filter, 可以添加到特定的Handler中
type Filter interface {
BeforeServeHTTP(http.ResponseWriter, *http.Request) bool
AfterServeHTTP(http.ResponseWriter, *http.Request) bool
}
type BaseHandler struct {
Filters []Filter
}
func (b BaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if b.Filters != nil {
for _, filter := range b.Filters {
if filter.BeforeServeHTTP(w, r) == false {
return
}
}
}
b.Handle(w, r)
if b.Filters != nil {
for _, filter := range b.Filters {
if filter.AfterServeHTTP(w, r) == false {
return
}
}
}
}
// 子类重写这个方法
func (b BaseHandler) Handle(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "BaseHandler")
}
type DemoHandler struct {
BaseHandler
}
func (d *DemoHandler) Handle(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "DemoHandler")
}
注意基类 BaseHandler 中红色的代码部分,是不能调用到子类DemoHandler的Handle方法的。
请问有什么办法可以实现这个么?
或者有比较好的其他实现方式么?
--
@QLeelulu | FaWave, Net4 Team | qlee...@gmail.com | 学海无涯,回头是岸