策略模式

2019-03-07  本文已影响0人  yuzhiyi_宇

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

策略模式的结构图

策略模式中的角色:

策略模式的简单实现

(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 类中,以代替这些条件语句。

策略模式的优缺点

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

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

上一篇下一篇

猜你喜欢

热点阅读