美文网首页
策略模式

策略模式

作者: 北风第一支 | 来源:发表于2017-06-21 21:07 被阅读0次

假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。

根据描述,折扣是根据以下的几个算法中的一个进行的:
  算法一:对初级会员没有折扣。
  算法二:对中级会员提供10%的促销折扣。
  算法三:对高级会员提供20%的促销折扣。

public interface DiscountStrategy {
    /**
    * 折扣策略
    * @param booksPrice 图书的原价
    * @return 计算出打折后的价格
    */
    public double calcPrice(double booksPrice);
}

初级会员

public class PrimaryMemberStrategy implements MemberStrategy {
    @Override
    public double calcPrice(double booksPrice) {
        return booksPrice;
    }
}

中级会员

public class IntermediateMemberStrategy implements MemberStrategy {
    @Override
    public double calcPrice(double booksPrice) {
        return booksPrice * 0.9;
    }
}

高级会员

public class AdvancedMemberStrategy implements MemberStrategy {
    @Override
    public double calcPrice(double booksPrice) {
        return booksPrice * 0.8;
    }
}

价格类

public class Price {
    //持有一个具体的策略对象
    private MemberStrategy strategy;
    /**
    * 构造函数,传入一个具体的策略对象
    * @param strategy 具体的策略对象
    */
    public Price(MemberStrategy strategy){
        this.strategy = strategy;
    }
    public void setPrice(MemberStrategy strategy){
        this.strategy = strategy;
    }
    /**
    * 计算图书的价格
    * @param booksPrice 图书的原价
    * @return 计算出打折后的价格
    */
    public double quote(double booksPrice){
        return this.strategy.calcPrice(booksPrice);
    }
}

调用:

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

策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。

相关文章

网友评论

      本文标题:策略模式

      本文链接:https://www.haomeiwen.com/subject/kintcxtx.html