开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情
开发中遇到这样一个业务,促销活动有不同的类型:满减、立减、折扣、免运费...等等,需要根据不同的活动类型进行优惠算价,让你设计并开发。
小白接收到需求是这样做的(以下是简单写法)
package main
type Activity struct {
// 1满减、2立减、3折扣、4免运费
ActivityType int
ActivityName string
}
func main() {
activity := new(Activity)
if activity.ActivityType== 1 {
// 满减活动算价逻辑
}else if activity.ActivityType==2 {
// 立减活动算价逻辑
}else if activity.ActivityType==3 {
// 折扣活动算价逻辑
}else if activity.ActivityType==4 {
// 免运费活动算价逻辑
}
}
你作为大佬,你肯定知道他的代码不优雅在哪
首先虽然 if else 这种分支接口简单明了很直观的看出具体活动的算价逻辑在哪,但是如果新增加一种活动类型:满n件x折,你就需要改动这个代码了,这种情况是违反开闭原则的。
那么如何优化呢?我们只需要将不同类型活动的算价逻辑单独的放到一个文件里面就可以了,这样新增一个活动类型,我们就新增一个文件,策略模式的好处就是可以提供多个算法途径,根据你的需要选择其中的一种进行运算
package main
import "fmt"
type Activity struct {
// 1满减、2立减、3折扣、4免运费
ActivityType int
ActivityName string
}
// CalculateStrategy 算价策略
type CalculateStrategy interface {
calculate()
}
// Discount 打折
type Discount struct {
}
// FullSubtract 满减
type FullSubtract struct {
}
func (f FullSubtract) calculate() {
fmt.Println("进行满减算价逻辑")
}
func (d Discount) calculate() {
fmt.Println("进行打折算价逻辑")
}
type ActivityFactory struct{
}
// 这里使用的简单工厂进行创建
func (a ActivityFactory) getCalculation(activityType int) *Activity {
activity := new(Activity)
if activityType== 1 {
new(对应的活动算价struct)
}else if activityType==2 {
new(对应的活动算价struct)
}else if activityType==3 {
new(对应的活动算价struct)
}else if activityType==4 {
new(对应的活动算价struct)
}
}
func main() {
activity := new(Activity)
factory := new(ActivityFactory)
calculateStrategy := factory.getCalculation(activity.ActivityType)
calculateStrategy.calculate()
}
上面写的简单的伪代码,其中不同的活动struct要单独放到一个go文件里面,创建对应的活动算价对象,我们用的是简单工厂来创建的,里面用的也是if else ,其实设计模式归根结底就是取舍,我们要做的就是做最少的改动来完成业务开发