• [工作中的设计模式]策略模式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、策略模式侧重于封装算法

      

  • 相关阅读:
    TypeError: can't compare offset-naive and offset-aware datetimes bugfix
    pg_restore数据库恢复指令
    第四十期百度技术沙龙笔记整理
    JS事件模型小结
    matlab Newton method
    Markdown 语法的简要规则
    iOS社交分享Twitter、Facebook、拷贝到剪切板、LINE、及邮件
    Linux系统调用过程分析
    iOS自己定义返回button(不影响返回手势)
    MAVEN项目模块化
  • 原文地址:https://www.cnblogs.com/jyyzzjl/p/5156217.html
Copyright © 2020-2023  润新知