一、模式解析
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式的关键点为:
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、策略模式侧重于封装算法