策略模式
作用:
策略模式是一种定义了一系列算法的方法,所有这些算法都是完成相同的工作,只是实现不同,他可以以相同的方式调用所有的算法。策略模式很容易理解,即便没有学习过设计模式,在实际问题也可以想出这种模式来解决问题。
相比工厂模式而言:
- 工厂模式的作用在于实例化对象,它不会包含对象的操作
- 策略模式中,再一次进行了封装,不仅在自己的类中实例化算法,并且有算法的操作。再次在客户端进行了封装,使客户端的代码更加简单明了了。
类图:
实现:
1、CashSuper算法的形式
public abstract class CashSuper { public abstract double getCash(double money); }
2、三个继承的算法
public class CashRebate extends CashSuper { private double rebate = 1; public CashRebate(double rebate) { this.rebate = rebate; } @Override public double getCash(double money) { // TODO Auto-generated method stub return money * rebate; } } public class CashReturn extends CashSuper { private double condition = 0; private double moneyReturn = 0; public CashReturn(double condition, double moneyReturn) { this.condition = condition; this.moneyReturn = moneyReturn; } @Override public double getCash(double money) { if(money >= this.condition) { money -= Math.floor(money/condition)*moneyReturn; } return money; } } public class NormalCash extends CashSuper { @Override public double getCash(double money) { // TODO Auto-generated method stub return money; } }
3、用于实例化算法和调用算法操作的context类
public class CashContext { CashSuper cs = null; public CashContext(String type) { switch(type) { case "normal": cs = new NormalCash(); break; case "rebate": cs = new CashRebate(0.8); break; case "return": cs = new CashReturn(300,80); break; } } public double getResult(double money) { return cs.getCash(money); } }
4、client类,用于测试
public class Client { public static void main(String[] args) { String type = "return"; double money = 400; CashContext cc = new CashContext(type); System.out.println(cc.getResult(money)); } }