策略模式对应于解决某一个问题的一个算法族,允许用户从这个算法族中任选一个算法解决某一问题,同时可以方便更新与增删算法
首先定义策略接口(以产品打折为例子):
public interface Strategy {
public double getPrice(double standardprice);//传入商品原价
}
首先定义不同的策略:(实现策略接口)
/*普通客户少量购买*/
public class NewCustomerFewStrategy implements Strategy{
@Override
public double getPrice(double standardprice) {
System.out.println("新客户小批量不打折");
return standardprice;
}
}
/*新客户大批量*/
public class NewCustomerManyStrategy implements Strategy{
@Override
public double getPrice(double standardprice) {
System.out.println("新客户大批量打九折");
return standardprice*0.9;
}
}
/*老客户小批量*/
public class OldCustomerFewStrategy implements Strategy {
@Override
public double getPrice(double standardprice) {
System.out.println("老客户小批量打八折");
return standardprice*0.9;
}
}
/*老客户大批量*/
public class OldCustomerManyStrategy implements Strategy {
@Override
public double getPrice(double standardprice) {
System.out.println("老客户大批量打七折");
return standardprice*0.7;
}
}
定义一个算法族,使得客户与算法直接分离:
/*算法族,和具体的策略类交互
* 具体的算法与客户端分离
* 如果使用spring依赖注入,可以通过配置文件,动态注入不同的策略*/
public class Context {
private Strategy strategy;//当前采用的算法
public Context(Strategy strategy) {//可以通过构造函数注入
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {//通过setter注入
this.strategy = strategy;
}
public void printPrice(double s){//客户调用该函数得到报价,s是产品原价
System.out.println("报价"+strategy.getPrice(s));
}
}
客户端实现策略模式:
public class client {
public static void main(String[] args) {
Strategy s1=new OldCustomerFewStrategy();
Context context=new Context(s1);//使用s1策略
context.printPrice(998);
}
}