[工作中的设计模式]策略模式stategy

一、模式解析

  策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

  策略模式的关键点为:

  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、策略模式侧重于封装算法

  

posted @ 2016-01-24 22:43  孤子  阅读(439)  评论(0编辑  收藏  举报