zoukankan      html  css  js  c++  java
  • 策略模式之使用场景

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

      根据描述,折扣是根据以下的几个算法中的一个进行的:

      算法一:对初级会员没有折扣。

      算法二:对中级会员提供10%的促销折扣。

      算法三:对高级会员提供20%的促销折扣。

    接口:

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

    初级会员类:

    public class PrimaryMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
    // TODO Auto-generated method stub
    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 strategy;
    /**
    * 构造函数,传入一个具体的策略对象
    * @param strategy 具体的策略对象
    */
    /**
    * 通过setPrice设置价格
    * @param strategy
    */

    public void setPrice(MemberStrategy strategy){
    this.strategy = strategy;
    }
    /**
    * 通过创建对象设置价格。
    * @param strategy
    */
    public Price(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 AdvancedMemberStrategy();
    MemberStrategy strategy = new IntermediateMemberStrategy();
    //创建环境
    //Price price = new Price();
    // price.setPrice(strategy);
    Price price = new Price(strategy);
    //计算价格
    double quote = price.quote(300);
    System.out.println("图书的最终价格为:" + quote);
    }
    }

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

  • 相关阅读:
    Java常用类库(二):Iterator迭代器和子范围视图
    Java常用类库(一) : Object 和日期类的简单使用
    MyBatis的逆向工程
    AdminLTE介绍和zTree的简单使用
    MyBatis分页组件--PageHelper
    SpringAop--系统日志简例
    Shiro
    Mysql(三):多表查询和存储程序
    MySql(二):常见的那些个约束
    正则表达式一些用法
  • 原文地址:https://www.cnblogs.com/cyz110/p/6372501.html
Copyright © 2011-2022 走看看