一、定义
构建中,某些对象的算法可能经常改变,如果将这些算法都编码到对象之中,将会使得对象变的异常复杂,而且有时候支持不使用的算法也是一个性能负担,Strategy模式定义一系列算法,把它们一个个封装起来,让这些算法在运行时可以互换,分离算法,将算法与本身解耦,使得算法可以独立于使用它的客户程序(稳定)而变化(扩展,子类化),符合开闭原则,从而解决上述问题。
二、类图
三、示例
1. 没有使用模式
package strategy
type taxBase struct {
name string
country string
money int
}
type salesOrder struct {
tax *taxBase
}
func (this * salesOrder) CalculateTax() int {
if this.tax.country == "CN_Tax" {
// ...
} else if this.tax.country == "US_Tax" {
// ...
} else if this.tax.country == "DE_Tax" {
// ...
}
}
2. 使用模式
package main
import (
"fmt"
)
type TaxStrategy interface {
CalculateTax() int
}
type CN_Tax struct{}
func (this *CN_Tax) CalculateTax() int {
//
}
type US_Tax struct{}
func (this *US_Tax) CalculateTax() int {
// ...
}
type DE_Tax struct{}
func (this *DE_Tax) CalculateTax() int {
// ...
}
type SaleOrder struct {
TaxStrategy
}
func (this *SaleOrder)SetContext(calculateTax TaxStrategy){
this.TaxStrategy = calculateTax
}
func (this *SaleOrder)GetCalculateTax(calculateTax TaxStrategy) int{
this.SetContext(calculateTax)
return this.CalculateTax()
}
四、总结
- Strategy及其子类为组件提供了一系列可重用的算法,从而使得类型在运行时方便地根据需要在各个算法之间进行切换
- Strategy模式提供了用条件判断语句的另一种选择,消除条件判断语句,就是在解耦合,含有许多条件判断语句的代码通常需要用Strategy模式
- 如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销