Java常用设计模式——策略模式

     策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化,它是一种行为型模式

策略模式中有三个对象

  • 环境对象(Context):该类中实现了对抽象策略中定义的接口或者抽象类的引用。
  • 抽象策略对象(Strategy):它可由接口或抽象类来实现。
  • 具体策略对象(ConcreteStrategy):它封装了实现同不功能的不同算法

    定义抽象策略对象

package com.strategypattern;

/**
 * @author yyx 2017年10月11日
 * 策略接口
 */
public interface DiscountStrategy {
    /**
     * 计算价格
     * 
     * @param commodityPrice
     * @return
     */
    public double discountPrice(double commodityPrice);
}

     定义具体策略对象

package com.strategypattern;

/**
 * @author yyx 2017年10月11日
 */
public class IsMemberDiscountStrategy implements DiscountStrategy {

    @Override
    public double discountPrice(double commodityPrice) {
        System.out.println("对于会员的折扣为10%");
        return commodityPrice * 0.9;
    }

}


package com.strategypattern;

/**
 * @author yyx 2017年10月11日
 */
public class NotMemberDiscountStrategy implements DiscountStrategy {
    @Override
    public double discountPrice(double commodityPrice) {
        System.out.println("对于非会员没有折扣");
        return commodityPrice;
    }

}

    定义环境对象

package com.strategypattern;

/**
 * @author yyx 2017年10月11日
 */
public class CalculatedPrice {
    private DiscountStrategy discountStrategy;

    public CalculatedPrice(DiscountStrategy discountStrategy) {
        super();
        this.discountStrategy = discountStrategy;
    }

    public void quote(double commodityPrice) {
        System.out.println("您的折扣价为:"
                + this.discountStrategy.discountPrice(commodityPrice));
    }
}

     定义测试类

package com.strategypattern;

/**
 * @author yyx 2017年10月11日
 */
public class PatternTest {
    public static void main(String[] args) {
        // 选择并创建需要使用的策略对象
        DiscountStrategy discountStrategy = new IsMemberDiscountStrategy();
        // 创建环境
        CalculatedPrice calculatedPrice = new CalculatedPrice(discountStrategy);
        // 计算价格
        calculatedPrice.quote(300);
    }
}

策略模式的优点

  (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复

  (2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后

策略模式的缺点

  (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况

  (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观

猜你喜欢

转载自www.cnblogs.com/xianya/p/9218717.html