目录结构
─project
│ main.go
│
├─controller
│ │ UserController.go
│ │
│ └─strategy
│ LoginStrategy.go
│
具体代码
controller/strategy/LoginStrategy.go
//定义登陆策略需要实现的接口
type LoginStrategy interface {
Do(ctx *gin.Context)
}
//具体登陆策略的执行者,他身上带着抽象的登陆策略
type LoginOperator struct {
loginStrategy Loginstrategy
}
//设置策略
func (operator *LoginOperator) SetOperator(strategy LoginStrategy) {
operator.loginStrategy = strategy
}
//执行登陆方法
func (operator *LoginOperator) DoLogin(ctx *gin.Context) {
operator.loginStrategy.Do(ctx)
}
type (
WebLogin struct {}
WXMpLogin struct {}
WXAppLogin struct {}
)
//实现接口
func (*WebLogin) Do(ctx *gin.Context) {
//do something
}
func (*SinaLogin) Do(ctx *gin.Context) {
//do something
}
controller/UserController.go
func Login(ctx *gin.Context) {
//先声明是什么策略的执行者
operator := strategy.LoginOperator{}
//设置准备选择具体哪个登陆策略执行
operator.SetStrategy(&strategy.WebLogin{})
//执行策略的方法
operator.DoLogin(ctx)
}