设计模式--策略模式
文章目录
策略模式 ,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。—抄自百度
测试 AppMain
public static void main(String[] args) {
CashContext cashContext = new CashContext();
Class<?> cashRebateClass = null;
String className = "com.sample.demo.designmodule.strategy.shop.CashRebate";
try{
/**
*
*/
cashRebateClass = Class.forName(className);
}catch (Exception e){
e.printStackTrace();
}
CashSuper cashRebate = null;
CashSuper cashRebate1 = null;
/**
* 通过反射获取构造函数,进行初始化
*/
Constructor<?> constructor[] = cashRebateClass.getConstructors();
try{
/**
* 通过反射获取对象实例
*/
cashRebate = (CashSuper)constructor[0].newInstance();
cashRebate1 = (CashSuper)constructor[1].newInstance(0.70);
}catch (Exception e){
}
System.out.println(cashRebate);
System.out.println(cashRebate1);
cashContext.setBehavior(cashRebate1);
//cashContext.setBehavior(cashRebate);
cashContext.GetResult(20);
}
抽象Context,各种抽象子类的桥梁
public class CashContext {
private CashSuper cashSuper;
public void setBehavior(CashSuper cashSuper) {
this.cashSuper = cashSuper;
}
public double GetResult(double money){
return cashSuper.acceptCash(money);
}
}
策略抽象基类 CashSuper
public abstract class CashSuper {
public abstract double acceptCash(double money);
}
策略抽象子类 CashNormal
public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
策略抽象子类 CashRebate
public class CashRebate extends CashSuper {
private double moneyRebate = 0.8d;
public CashRebate() {
}
public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}
@Override
public double acceptCash(double money) {
System.out.println(money*moneyRebate);
return money*moneyRebate;
}
}
策略抽象子类 CashReturn
public class CashReturn extends CashSuper {
private double moneyCondition = 0.05d;
private double moneyReturn = 0.05d;
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;
}
return 0;
}
}