Strategy(策略模式)
Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。
Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。
C++
代码:更改前
enum TaxBase{
CN_Tax,
US_Tax,
DE_tax // 增加
};
class SalesOrder{
private:
TaxBase tax;
public:
double CalculateTax(){
switch (tax){
case CN_Tax:
return 0.0;
case US_Tax:
return 1.0;
case DE_tax: // 增加
return 2.0;
default:
return 3.0;
}
}
};
代码:更改后
class TaxBase{
public:
virtual double CalculateTax() = 0;
~TaxBase(){};
};
class CN_Tax:public TaxBase{
public:
double CalculateTax() override {
return 0.0;
}
};
class US_Tax:public TaxBase{
public:
double CalculateTax() override {
return 1.0;
}
};
// 增加
class DE_tax:public TaxBase{
public:
double CalculateTax() override {
return 2.0;
}
};
class SalesOrder{
private:
TaxBase* tax;
public:
SalesOrder(TaxBase* t):tax(t){};
double CalculateTax(){
return tax->CalculateTax();
}
};
golang
更改前
package strates
import "context"
type Tax int
const (
CN_Tax Tax = iota
US_Tax
DE_Tax
)
func Calculate_Tax(ctx context.Context,tax Tax) float64{
switch tax {
case CN_Tax:
return 1.0
case US_Tax:
return 2.0
case DE_Tax:
return 3.0
default:
return 0.0
}
}
更改后
package strates
import (
"context"
"time"
)
type TaxStrategy interface {
Calculate(ctx context.Context)
}
type (
CNTax int
USTax int
DETax int
)
func (cnTax CNTax) Calculate(ctx context.Context) {
go func() {
for {
println(1.0)
time.Sleep(1);
}
}()
select {
case <-ctx.Done():
}
}
func (usTax USTax) Calculate(ctx context.Context) {
go func() {
for {
println(2.0)
time.Sleep(2);
}
}()
select {
case <-ctx.Done():
}
}
func (deTax DETax) Calculate(ctx context.Context) {
go func() {
for {
println(3.0)
time.Sleep(3);
}
}()
select {
case <-ctx.Done():
}
}
func CalculateTax(ctx context.Context,t TaxStrategy) {
t.Calculate(ctx)
}