策略设计模式

策略模式定义了一套算法,在不同场景下使用不同的算法,主要包括3个角色:抽象策略、具体策略、环境。

  • 抽象策略:定义策略接口,通常是抽象类或者接口。
  • 具体策略:策略接口的一组实现类,实现不同的算法。
  • 环境:持有策略的引用,暴露给客户端。

示例

比如这样一个场景:商品打折。一般商品在节假日商家会进行打折销售,不同的节日打折力度会不一样,假如一般的节假日打9折,中秋国庆节假日打8折,春节打7折。对于打折来说可以定义不同的策略:

// 折扣策略
public interface Discount {

    public double getDiscount();
}
// 春节打折策略
public class SevenDiscount implements Discount {

    @Override
    public double getDiscount() {
        return 0.7;
    }
}
// 中秋节打折策略
public class EightDiscount implements Discount {
    @Override
    public double getDiscount() {
        return 0.8;
    }
}
// 一般节假日打折策略
public class NineDiscount implements Discount {
    @Override
    public double getDiscount() {
        return 0.9;
    }
}
// 环境类(暴露给客户端)
public class Sale {
    // 持有折扣策略引用
    private Discount discount;

    public Discount getDiscount() {
        return discount;
    }

    public void setDiscount(Discount discount) {
        this.discount = discount;
    }

    // 销售价格
    public double sale(double realPrice) {
        return realPrice * discount.getDiscount();
    }
}
// 客户端
public class Client {
    public static void main(String[] args) {
        double realPrice = 25.4;
        Sale sale = new Sale();
        Discount discount;

        // 一般节假日打9折
        discount = new NineDiscount();
        sale.setDiscount(discount);
        System.out.println("一般节假日打折价格为: " + sale.sale(realPrice));

        // 中秋节打8折
        discount = new EightDiscount();
        sale.setDiscount(discount);
        System.out.println("中秋节打折价格为: " + sale.sale(realPrice));

        // 春节打7折
        discount = new SevenDiscount();
        sale.setDiscount(discount);
        System.out.println("春节打折价格为: " + sale.sale(realPrice));
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容