策略模式的结构图策略模式(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 类中,以代替这些条件语句。
策略模式的优缺点
优点:
使用策略模式可以避免使用很多多重条件语句。多重条件语句不易维护,而且易出错。
易于拓展,当需要添加一个策略时,只需要实现接口就可以了。
缺点:
每一个策略都是一个类,复用性小。如果策略过多,类的数量会增多。
上层模块必须知道有哪些策略,才能使用这些策略,这与迪米特原则违背。
网友评论