策略模式
2020-06-22 本文已影响0人
nieniemin
什么是策略模式
,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
模式角色
策略接口角色(ICashSuper):用来约束一系列具体的策略算法,策略上下文角色ConcreteStrategy使用此策略接口来调用具体的策略所实现的算法。
具体策略实现角色():具体的策略实现,即具体的算法实现。
策略上下文角色StrategyContext:策略上下文,负责和具体的策略实现交互,通常策略上下文对象会持有一个真正的策略实现对象,策略上下文还可以让具体的策略实现从其中获取相关数据,回调策略上下文对象的方法。
UML类图
策略模式代码实现
代码以商场促销为例使用策略模式实现商场促销算法。
public interface ICashSuper {
double acceptCash(double money);
}
// 商品不打折
public class CashNormal implements ICashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
// 淡季商品开始打折出售
public class CashRebate implements ICashSuper {
// 活动打折
private double moneyRebate;
public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}
@Override
public double acceptCash(double money) {
return money * moneyRebate;
}
}
// 618满300减40活动
public class CashReturn implements ICashSuper {
// 满300减40活动.
@Override
public double acceptCash(double money) {
if (money / 300 >= 1) {
double v = Math.floor(money / 300);
return money - v * 40;
}
return money;
}
}
// 上下文对象
public class ContextStrategy {
// 维护对cashSuper策略对象的引用.
private ICashSuper cashSuper;
public ContextStrategy(ICashSuper cashSuper) {
this.cashSuper = cashSuper;
}
public double contextInterface(double money) {
System.out.println(this.cashSuper.getClass().getSimpleName() + ":" + cashSuper.acceptCash(money));
return cashSuper.acceptCash(money);
}
}
public class Client {
public static void main(String[] args) {
ContextStrategy cashNormalContext = new ContextStrategy(new CashNormal());
cashNormalContext.contextInterface(400);
ContextStrategy cashRebateContext = new ContextStrategy(new CashRebate(0.8));
cashRebateContext.contextInterface(400);
ContextStrategy cashReturnContext = new ContextStrategy(new CashReturn());
cashReturnContext.contextInterface(400);
}
}
CashNormal:400.0
CashRebate:320.0
CashReturn:360.0
优点
可以自由切换算法
避免了多条件的判断
扩展性好可以定义新的算法提供给使用者
缺点
算法类数量增多,每个算法都是一个类
算法要对外安全暴露,因为使用者来决定是用哪个算法,必然要了解算法内部做了什么。
策略模式完整代码