如何更优雅的写GO-策略模式

(希望大家收藏的同时也点个赞或加个关注哈~目前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 {
}

虽然按这种模式写起来简单快捷,但它也违背了面向对象的两个原则:

  1. 单一职责原则:多个控制语句,意味着拥有多种功能;
  2. 开闭原则:当要进行修改时,原有代码不可避免要被修改;

此时就可以采用策略模式来替换这类多层控制语句。又或者,我们在为一个对象添加行为时发现,该对象可以用多种方式去达成同一个目的,区别在于使用场景不同、效率不同,和上面提到的出行使用交通工具场景类似。

如何基于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值