设计模式----策略模式
/**
* 总结:
* 策略模式和简单工厂模式是很相似的,对于抽象父类和具体子类那里和简单工厂是一回事
* 不过下面还多添加了一个Context类,用来调用算法接口
* 来说说简单工厂和策略模式的区别:
* 简单工厂是生产对象来调用对象的方法,在主函数中用简单工厂生产对象调用方法
* 而策略模式是在Context类中生产对象,然后在Context类中调用Context中的对象的方法,在主函数中创建Context类的对象调用方法
*
*
* 总而言之 策略模式是一种定义了一系列算法的方法,(多态真是绝绝子,yyds,正是多态才完美的实现了继承的功能 真正做到了降低代码的冗余)
* 从context类来看我们只是创建了一个抽象父类,调用了这个抽象父类中的抽象方法,而switch去实例化它的子类,编译是看的是父类
* 运行时,真正调用的其实是子类的方法,这就是多态。
* 如果我们想多添加功能只需要添加对应的子类,重写方法,然后再context类中多添加一个case分支,就可以了,不需要对我们的代码进行“大手术”
*
*/
下面先给出策略模式的模板
/**
*
* 策略模式模板
*
* 通过一个抽象父类,定义算法接口 接下来的三个子类 StrategyA StrategyB StrategyC 都是具体子类,实现抽象算法接口方法
*
*
*/
public abstract class StrategyTemplate {
public abstract void AlgorithmInterface(); //算法接口
}
class ConcreteStrategyA extends StrategyTemplate{
@Override
public void AlgorithmInterface()
{
System.out.println("算法A");
}
}
class ConcreteStrategyB extends StrategyTemplate{
@Override
public void AlgorithmInterface()
{
System.out.println("算法B");
}
}
class ConcreteStrategyC extends StrategyTemplate{
@Override
public void AlgorithmInterface()
{
System.out.println("算法C");
}
}
/**
* 具体操作类 用一个具体策略来配置, 维护 一个对 Strategy对象的引用
*
*/
class Context
{
private StrategyTemplate strategy = null;
public Context(StrategyTemplate strategy) { //初始化时,传入具体的策略对象,不要死板,具体问题具体对待,我们也可以传入别的参数进行一个判断,维护对 Strategy对象的引用
this.strategy = strategy;
}
public void ContextInterface() //根据具体的策略对象,调用其算法的方法
{
strategy.AlgorithmInterface();
}
}
那么我们再来看一个具体的例子:商城策略模式
/**
* 现金收费抽象父类及其子类
* 正常收费子类 买了多少钱要多少钱
* 打折收费子类 打 n 折 0<n<10
* 返利收费子类 满 n 返 m n > m n , m ∈ N
*
*/
public abstract class CashSuper {
public abstract double acceptCash(double money);
}
class CashNormal extends CashSuper{ //正常收费
@Override
public double acceptCash(double money)
{
return money;
}
}
class CashRebate extends CashSuper //打折收费
{
private double moneyRebate = 1;
public CashRebate(String moneyRebate)
{
this.moneyRebate = Double.parseDouble(moneyRebate);
}
@Override
public double acceptCash(double money)
{
return money * moneyRebate;
}
}
class CashReturn extends CashSuper //满多少返多少收费
{
private double moneyCondition = 0; //满多少
private double moneyReturn = 0; //送多少
public CashReturn(double moneyCondition, double moneyReturn)
{
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
@Override
public double acceptCash(double money)
{
double res = money;
int n = (int) money / (int) moneyCondition;
money -= n*moneyReturn;
return money;
}
}
/**
* Context类 方法的集合
*
*/
class CashContext{
private CashSuper cs = null;
public CashContext(String type)
{
switch (type)
{
case "正常收费":
cs = new CashNormal();
break;
case "满300返100":
cs = new CashReturn(300,100);
break;
case "打八折":
cs = new CashRebate("0.8");
break;
}
}
public double GetResult(double money)
{
return cs.acceptCash(money);
}
}
下面就是一个main函数
public class StrategyTest {
public static void main(String[] args) {
CashContext cashContext = new CashContext("正常收费");
System.out.println("1000元正常收费:"+cashContext.GetResult(1000));
cashContext = new CashContext("打八折");
System.out.println("1000元打八折:"+cashContext.GetResult(1000));
cashContext = new CashContext("满300返100");
System.out.println("1000元满三百减一百:"+cashContext.GetResult(1000));
}
}
运行结果:
1000元正常收费:1000.0
1000元打八折:800.0
1000元满三百减一百:700.0