java设计模式之策略模式

策略模式:是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。

这个模式涉及到三个角色:
1、环境(Price)角色:持有一个Strategy的引用;
2、抽象策略(MemberStrategy)角色:这是一个抽象角色,通常有一个接口或者抽象类实现。此角色给出所有的具体策略类所需的接口。
3、具体策略(PrimaryMemberStrategy、IntermediateMemberStrategy、AdvancedMemberStrategy)角色:包装了相关的算法或者行为。

使用场景

针对不同会员等级提供促销折扣:
     算法一:对初级会员没有折扣。
  算法二:对中级会员提供10%的促销折扣。
  算法三:对高级会员提供20%的促销折扣。
源代码:
/**
 * 抽象接口类
 */
public interface MemberStrategy {

    /**
     * 计算图书的价格
     *
     * @param booksPrice 图书的原价
     * @return 计算出打折后的价格
     */
    double calcPrice(double booksPrice);
}
/**
 * 初级会员策略算法类
 */
public class PrimaryMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
        System.out.println("对于初级会员的没有折扣");
        return booksPrice;
    }
}
/**
 * 中级会员策略算法类
 */
public class IntermediateMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
        System.out.println("对于中级会员的折扣为10%");
        return booksPrice * 0.9;
    }
}
/**
 * 高级会员策略算法类
 */
public class AdvancedMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
        System.out.println("对于高级会员的折扣为20%");
        return booksPrice * 0.8;
    }
}
/**
 * 持有策略对象的价格类
 */
public class Price {
    //持有一个具体的策略对象
    private MemberStrategy memberStrategy;
    /**
     * 构造函数,传入一个具体的策略对象
     *
     * @param memberStrategy 具体的策略对象
     */
    public Price(MemberStrategy memberStrategy) {
        this.memberStrategy = memberStrategy;
    }
    /**
     * 计算图书价格
     *
     * @param booksPrice 图书原价
     * @return 计算出打折后的价格
     */
    public double quote(double booksPrice) {
        return this.memberStrategy.calcPrice(booksPrice);
    }
}
/**
 * 对高级会员进行使用策略方案
 */
public class StrategyMain {

    public static void main(String[] args) {
        //选择并创建需要使用的策略对象
        MemberStrategy memberStrategy = new AdvancedMemberStrategy();
        //将策略对象放入需要具体策略的类
        Price price = new Price(memberStrategy);
        //计算价格
        double quote = price.quote(300);
        System.out.println("图书的最终价格为:" + quote);
    }
}

运行结果:

原文地址:https://www.cnblogs.com/hujinshui/p/9451597.html