策略模式

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

优点
可以自由切换算法
避免了多条件的判断
扩展性好可以定义新的算法提供给使用者
缺点
算法类数量增多,每个算法都是一个类
算法要对外安全暴露,因为使用者来决定是用哪个算法,必然要了解算法内部做了什么。
策略模式完整代码

上一篇下一篇

猜你喜欢

热点阅读