简介
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
实现
策略设计模式由以下几个部分组成
- 封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。
-
抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这
部分公共的代码,此时,策略模式看上去更像是模版方法模式。 -
具体策略:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要*替换。
假设有这样一个需求
商店购物:
- 青铜会员打九五折
- 白银会员打九折
- 白金会员打八折
- 我们先写抽象策略
public interface Strategy {
double getPrice(double standardPrice);
}
- 三种具体策略
/**
* 青铜用户
* @author guxiang
* @date 2017-2-23 下午8:09:56
*/
public class BronzeMember implements Strategy {
public double getPrice(double standardPrice) {
System.out.println("九五折");
return standardPrice*0.95;
}
}
/**
* 白银用户
* @author guxiang
* @date 2017-2-23 下午8:10:57
*/
public class SilverMember implements Strategy {
public double getPrice(double standardPrice) {
System.out.println("九折");
return standardPrice*0.9;
}
}
/**
* 白金用户
* @author guxiang
* @date 2017-2-23 下午8:10:23
*/
public class PlatinoMember implements Strategy{
public double getPrice(double standardPrice) {
System.out.println("八折");
return standardPrice*0.8;
}
}
- 封装类(上下文类)
/**
* context负责具体与策略类的交互
* 在spring中的依赖注入功能,可以通过配置文件,动态注入策略对象
* @author guxiang
* @date 2017-2-23 下午8:53:57
*/
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 getFinallyPrice( double standardPrice) {
System.out.println("报价是"+strategy.getPrice(standardPrice));
}
}
策略模式的本质其实就是 分离算法,选择实现
- JAVASE中的GUI编程就中的布局管理器是最常用的策略模式,Flow布局,Border布局,Card布局
- Spring框架中,Resource接口,实现的资源访问策略