(希望大家收藏的同时也点个赞或加个关注哈~目前3000多个收藏,1000多个赞。。。)
策略模式(Strategy Pattern)是设计模式中较为常用的一种。当我们做某件事情时,比如出行前往某个地方,我们可以坐车、骑自行车,甚至可以用平衡车,而且随着科技发展,出行方式也将越来越丰富。将这种场景映射到程序中,个人作为对象,出行可以使用多种交通工具,策略模式将会把交通工具封装为多个类,个人可以根据环境/目的不同,灵活地选择合适的类来达到目的。
何时使用策略模式
我们在用GO编程的时候经常碰到多层控制语句,一层又一层,既不优雅,也不利于后续维护。比如下述这种:
if xxx {
// do something
} else if xxx {
// do something
} else if xxx {
// do something
} else if xxx {
// do something
} else {
}
虽然按这种模式写起来简单快捷,但它也违背了面向对象的两个原则:
- 单一职责原则:多个控制语句,意味着拥有多种功能;
- 开闭原则:当要进行修改时,原有代码不可避免要被修改;
此时就可以采用策略模式来替换这类多层控制语句。又或者,我们在为一个对象添加行为时发现,该对象可以用多种方式去达成同一个目的,区别在于使用场景不同、效率不同,和上面提到的出行使用交通工具场景类似。
如何基于GO实现策略模式
基于上述的两种场景,可以使用GO的Interface机制来实现策略模式,以支持不同策略的灵活切换,又或者避免多层控制语句的不优雅实现,继续以出行和交通工具举例。
为交通工具定义一个Interface,作为不同策略的调用入口:
type Vehicle interface {
Go()
}
定义多种交通工具的struct,实现Vehicle中的run方法:
type Car struct {
}
func (r *Car) Go() {
fmt.Println("use car")
}
type Bicycle struct {
}
func (r *Bicycle) Go() {
fmt.Println("use Bicycle")
}
定义主体Traveler,作为执行不同策略的对象,它可以使用Vehicle作为入参,执行不同策略的Do方法,如下所示:
type Traveler struct {
impl Vehicle
}
func (r * Traveler)SetVehicle(i Vehicle) {
r.impl = i
}
func (r * Traveler)Go() {
r.impl.Go()
}
最后是如何使用,为对象traveler传入不同的交通工具,traveler只需要执行Go方法即可,该模式在支持灵活切换基础上,也符合单一职责原则和开闭原则。
func main() {
traveler:= Traveler{}
traveler.SetVehicle(&Car{})
traveler.Go()
traveler.SetVehicle(&Bicycle{})
traveler.Go()
}
GO大厂面试题和学习资料获取:
欢迎大家随时交流 VX —> yifeng2012