设计模式开始--策略模式

策略模式

作用:

策略模式是一种定义了一系列算法的方法,所有这些算法都是完成相同的工作,只是实现不同,他可以以相同的方式调用所有的算法。策略模式很容易理解,即便没有学习过设计模式,在实际问题也可以想出这种模式来解决问题。

相比工厂模式而言:

  • 工厂模式的作用在于实例化对象,它不会包含对象的操作
  • 策略模式中,再一次进行了封装,不仅在自己的类中实例化算法,并且有算法的操作。再次在客户端进行了封装,使客户端的代码更加简单明了了。

类图:

实现:

 1、CashSuper算法的形式

public abstract class CashSuper {
    public abstract double getCash(double money);
}
View Code

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;
    }
}
View Code

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);
    }
}
View Code

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));
    }
}
View Code

 

posted on 2015-03-29 16:35  zhouzhou0615  阅读(156)  评论(0编辑  收藏  举报

导航