一、模式解析
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式的关键点为:
1、多种算法存在
2、算法继承同样的接口,执行同样的行为,为可以替代的
3、算法调用者唯一,算法调用者可以灵活改变自己需要调用的算法,从而实现计算。
二、模式代码
算法接口:
/**
* 算法统一接口,所有算法继承此接口
* @author zjl
* @time 2016-1-24
*
*/
public interface IStrategy {
public void opration();
}
算法具体实现1:
public class StrategyA implements IStrategy {
@Override
public void opration() {
System.out.println("策略A正在执行");
}
}
算法具体实现2:
public class StrategyB implements IStrategy {
@Override
public void opration() {
System.out.println("策略B正在执行");
}
}
算法持有者和调用者
/**
* 算法持有者,通过创建此对象创建算法,并执行算法运算
* @author zjl
*
*/
public class Context {
private IStrategy strategy;
public Context(IStrategy strategy){
this.strategy=strategy;
}
public void execute(){
this.strategy.opration();
}
}
客户端调用程序:
public class Client {
public static void main(String[] args) {
Context context=new Context(new StrategyA());
context.execute();//策略A正在执行
}
}
三、应用场景
策略模式主要侧重于计算,在工作中涉及到银行软件中,最为明显的就是手续费计算,根据不同客户的要求,有些客户要求所有手续费由渠道系统进行计算,有些要求由核心统一计算后提供给渠道,所以就会存在不同客户使用时候进行替换。
四、应用代码
/**
* 手续费查询接口
* @author zjl
*/
public interface IFee {
public int getFee();
}
public class FeeFromLocal implements IFee {
@Override
public int getFee() {
System.out.println("通过本地计算手续费");
return 100;
}
}
/**
* 从核心获取手续费
* @author zjl
*
*/
public class FeeFromRemote implements IFee {
@Override
public int getFee() {
System.out.println("正在从核心获取手续费");
return 100;
}
}
转账交易时候要求计算手续费,此处转账流程略:
public class Transfer {
private IFee feeImpl;
public void setIFee(IFee feeImpl){
this.feeImpl=feeImpl;
}
public void execute(){
System.out.println("转账开始。。。。");
int fee=feeImpl.getFee();
System.out.println("手续费为:"+fee);
System.out.println("转账完成。。。。");
}
}
客户端调用方法,可以是网银或者手机发起
public class Client {
public static void main(String[] args) {
Transfer transfer=new Transfer();
transfer.setIFee(new FeeFromRemote());//项目中手续费计算方式通常由框架进行注入
transfer.execute();
}
}
五、与其他模式关系
1、如果此持有者和策略继承同一个接口,那么策略模式将变为代理模式
但策略模式和代理模式含义不同,应用场景也不同,代理模式的代理者与被代理这拥有同样的性质和方法
2、通过扩展持有者,使持有者形成抽象类,然后实现多个具体持有者,策略模式可以转化为桥接模式
3、策略模式侧重于封装算法