策略模式strategy
–策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。
本质:
–分离算法,选择实现
模拟客户打折
package studyGFO;
public interface Strategy {
public double getPrice(double standPrice);
}
package studyGFO;
public class OldCustomerMany implements Strategy{
@Override
public double getPrice(double standPrice) {
System.out.println("打七折");
return standPrice*0.7;
}
}
package studyGFO;
public class OldCustomerFew implements Strategy{
@Override
public double getPrice(double standPrice) {
System.out.println("原价");
return standPrice;
}
}
package studyGFO;
public class NewCustomerMany implements Strategy{
@Override
public double getPrice(double standPrice) {
System.out.println("原价");
return standPrice;
}
}
package studyGFO;
public class NewCustomerFew implements Strategy{
@Override
public double getPrice(double standPrice) {
System.out.println("打八折");
return standPrice*0.8;
}
}
package studyGFO;
/**
* 上下文类 负责具体的策略类交互
* 这样的话就可以算法和具体的客户端
* 使得算法可以脱离客户端独立运行
* 如果使用spring的依赖注入功能,还可以通过配置文件,动态的切换不同的算法
* @author http://blog.csdn.net/thewaiting
*
*/
public class Context {
private Strategy strategy;//当前采用的算法
//构造器注入
public Context(Strategy strategy) {
super();
this.strategy = strategy;
}
//可以set方法注入
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void pringRrice(double s) {
System.out.println("报价:"+strategy.getPrice(s));
}
}
package studyGFO;
public class Client {
public static void main(String[] args) {
Strategy s1 = new OldCustomerMany();
Context context = new Context(s1);
context.pringRrice(99);
}
}
开发中常见的场景
–JAVASE中GUI编程中,布局管理器
–Spring框架中,Resource接口,资源访问策略
–javax.servlet.http.HttpServlet#service()