美文网首页
策略模式

策略模式

作者: yuzhiyi_宇 | 来源:发表于2019-03-07 18:56 被阅读0次

    策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的改变,不会影响到使用算法的客户。

    策略模式的结构图

    策略模式中的角色:

    • Context:上下文角色,用来操作策略的上下文环境,起到承上启下的作用,屏蔽高层模块对策略、算法的直接访问。
    • Stragety:抽象策略角色,策略、算法的抽象,通常为接口。
    • ConcreteStragety:具体的策略实现

    策略模式的简单实现

    (1)定义策略接口类

    public abstract class CashSuper {
        public abstract double acceptCash(double money);
    }
    

    (2)具体策略实现

    public class CashNormal extends CashSuper {
        @Override
        public double acceptCash(double money) {
            return money;
        }
    }
    
    public class CashReturn extends CashSuper {
    
        private double moneyCondition = 0.0d;
        private double moneyReturn = 0.0d;
        public CashReturn(double moneyCondition, double moneyReturn) {
            this.moneyCondition = moneyCondition;
            this.moneyReturn = moneyReturn;
        }
    
        @Override
        public double acceptCash(double money) {
            double result = money;
            if (money >= moneyCondition) {
                result = money - Math.floor(money / moneyCondition) * moneyReturn;
            }
            return result;
        }
    }
    
    public class CashRebate extends CashSuper {
    
        public double moneyRebate = 1d;
    
        public CashRebate(double momeyRebate) {
            this.moneyRebate = momeyRebate;
        }
    
        @Override
        public double acceptCash(double money) {
            return money * moneyRebate;
        }
    }
    

    (3)上下文角色

    public class CashContext {
    
        private CashSuper cashSuper;
    
        public CashContext(CashSuper cashSuper) {
            this.cashSuper = cashSuper;
        }
    
        public double getResult(double money) {
            return cashSuper.acceptCash(money);
        }
    }
    

    (4)客户端调用

    public class Client {
        public static void main(String[] args) {
            CashContext cashContext = new CashContext(new CashNormal());
            System.out.println(cashContext.getResult(100));
    
            CashContext cashContext1 = new CashContext(new CashReturn(300, 100));
            System.out.println(cashContext1.getResult(400));
    
            CashContext cashContext2 = new CashContext(new CashRebate(0.8));
            System.out.println(cashContext2.getResult(100));
        }
    }
    

    (5)输出

    100.0
    300.0
    80.0
    

    策略模式的使用场景

    使用场景:
    对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
    针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
    在一个类中定义了很多行为,而且这些行为在这个类里的操作以多个条件语句的形式出现。策略模式将相关的条件分支移入它们各自的 Strategy 类中,以代替这些条件语句。

    策略模式的优缺点

    优点:
    使用策略模式可以避免使用很多多重条件语句。多重条件语句不易维护,而且易出错。
    易于拓展,当需要添加一个策略时,只需要实现接口就可以了。

    缺点:
    每一个策略都是一个类,复用性小。如果策略过多,类的数量会增多。
    上层模块必须知道有哪些策略,才能使用这些策略,这与迪米特原则违背。

    相关文章

      网友评论

          本文标题:策略模式

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