目錄結構
─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)
}