策略模式定义了一套算法,在不同场景下使用不同的算法,主要包括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));
}
}