初识设计模式——策略模式(Java)

版权声明:以上所有博客均为冷漠的小猿所有,引用请注明出处 https://blog.csdn.net/lyf1997115/article/details/81570820

策略模式

  • 它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。

UML图

  1. Strategy类为所有算法的父类,其定义了一个用户使用接口——AlgorithmInterface(),此接口用于实现各种算法,将计算后的结果返回给调用处。
  2. StrategyA、StrategyB、StrategyC表示各种不同的算法子类,他们共同继承Strategy父类,并各自重写AlgorithmInterface()方法,已达成不同的算法。
  3. Context上下文操作类,管理着所有的策略类,根据用户传入的数据来选择相应的策略,将其使用接口AlgorithmInterface()方法返回给用户。

使用策略模式实现商场收银系统
功能:
* 1.根据客户所购买的商品的数量和单价,来向客户收费
* 2.根据需要打一定折扣扣
* 3.满返活动

策略类(Strategy类)

/**
 * 策略类
 * @author Administrator
 *
 */
public abstract class CashStrategy {
    /**
     * 接收原本价格,返回运算后的价格
     * @param money
     * @return
     */
    public abstract double acceptCash(double money) ;//AlgorithmInterface()接口方法,接收原始价位,返回优惠后的价位
}

算法类A(StrategyA)——正常收费

/**
 * 正常收费标准
 * @author Administrator
 *
 */
public class CashNormal extends CashStrategy{

    @Override
    public double acceptCash(double money) {
        // TODO Auto-generated method stub
        return money;
    }

}

算法类B(StrategyB)——打折

/**
 * 打折收费
 * @author Administrator
 *
 */
public class CashRebate extends CashStrategy{

    private double moneyRebate = 1 ;
    public CashRebate(double moneyRebate) {
        this.moneyRebate = moneyRebate ;
    }
    @Override
    public double acceptCash(double money) {
        // TODO Auto-generated method stub
        return money * this.moneyRebate;
    }

}

算法类C(StrategyC)—— 满减活动

public class CashReturn extends CashStrategy{
    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) {
        if (money >= moneyCondition) {
            return money - (int)(money / moneyCondition) * moneyReturn ;
        }
        return money;
    }

}

策略工厂(Context)

 结合简单工厂模式将上下文类改装为工厂形式,避免了逻辑代码暴露给客户端
public class ContextFactory {
    CashStrategy cs = null ;
    public ContextFactory(String str) {

        switch (str) {
        case "正常收费":
            cs = new CashNormal() ;
            break;
        case "满300返100":
            cs = new CashReturn(300, 100) ;
            break;
        case "打八折":
            cs = new CashRebate(0.8) ;
            break;
        default:
            break;
        }
    }

    public double GetResult(double money) {
        return cs.acceptCash(money) ;
    }

}

客户端

/**
 * 商场收银软件
 * 功能:
 * 1.根据客户所购买的商品的数量和单价,来向客户收费
 * 2.根据需要打一定折扣扣
 * 3.满返活动
 * 
 * 将判断交给工厂,解放客户端
 * @author Administrator
 *
 */
public class User {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String[] str = {"正常收费","满300返100","打八折"} ;
        int n = 5 ;
        double price = 352 ;
        ContextFactory cf = new ContextFactory(str[1]) ;
        System.out.println(cf.GetResult(n * price));
    }

}

总结

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所有的算法,减少了各种与使用算法类之间的耦合。
~
策略模式的Strategy类层为Context定义了一系列的可重用的算法或行为。继承有助于析取出这些算法中的公共功能
~
策略模式的优点是为了简化单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试
~
策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不用业务规则,就可以考虑使用策略模式处理各种变化的可能性

猜你喜欢

转载自blog.csdn.net/lyf1997115/article/details/81570820
今日推荐