美文网首页
策略模式

策略模式

作者: nieniemin | 来源:发表于2020-06-22 22:49 被阅读0次

    什么是策略模式

    ,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

    模式角色

    策略接口角色(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
    

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

    相关文章

      网友评论

          本文标题:策略模式

          本文链接:https://www.haomeiwen.com/subject/nslatktx.html