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

      

  • 相关阅读:
    linux入门_韩顺平_复习版_用户管理
    linux入门_韩顺平_复习版_开启、重启、用户登陆注销
    python入门_老男孩_列表的增删查改
    git入门_尚硅谷_git简介
    码农要求_python豆瓣_2018校招
    python入门_老男孩_数据类型简介_int/bool/str转换_字符串索引和切片_字符串操作_day3
    LeetCode--链表3-经典问题
    LeetCode--链表2-双指针问题
    LeetCode--链表1-单链表
    LeetCode---二叉树3-总结例题
  • 原文地址:https://www.cnblogs.com/jyyzzjl/p/5156217.html
Copyright © 2011-2022 走看看