策略设计模式 - 定义、案例分析、开发应用场景和源码应用场景

1. 策略设计模式定义?


  • 定义:策略模式定义了一系列的算法,并且将每一个算法封装起来,而且它们之间可以相互切换;
  • 使用:比如在项目中写了3套网络框架:XUtils、OkHttp、Retrofit,这3套网络框架可以来回切换;
  • 体现了六大基本原则中的:开闭原则、里氏替换原则;

只需要记住:只要可以相互切换的,就是策略设计模式;

2. 策略模式 - 案例分析 - 投资理财


计算:10000元的利息和本金

  • 支付宝:
    3个月: 4.7%
    6个月: 5.0%
    12个月:6.0%
  • 人众金服
    3个月: 9%
    6个月: 11.2%
    12个月:12%

3. 投资理财案例代码如下


1>:首先定义一个接口,IFinance

/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/5/13 16:09
 * Version 1.0
 * Params:
 * Description:    金融服务的接口
*/

public interface IFinance {
    float finance(int month , int money) ;
}

2>:然后分别定义 支付宝的计算理财的类和人众金服计算的类,ZhifubaoFinance和RenzhongFinance,让这两个类分别实现 第一步中的 IFinance接口,然后实现其方法

  • a:支付宝的类 计算方法如下
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/5/13 15:48
 * Version 1.0
 * Params:
 * Description:    策略模式 - 支付宝计算方式
*/

public class ZhifubaoFinance implements IFinance {
    @Override
    public float finance(int month, int money) {
        if (month == 3) {
            return money + money * 0.047f / 12 * month;
        }
        if (month == 6) {
            return money + money * 0.05f / 12 * month;
        }
        if (month == 12) {
            return money + money * 0.06f / 12 * month;
        }
        throw new IllegalArgumentException("月份不对");
    }
}
  • b:人众金服的类 的计算方法如下
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/5/13 15:49
 * Version 1.0
 * Params:
 * Description:    策略模式 - 人众金服计算方式
*/

public class RenzhongFinance implements IFinance {
    @Override
    public float finance(int month, int money) {
        if (month == 3) {
            return money + money * 0.09f / 12 * month;
        }
        if (month == 6) {
            return money + money * 0.112f / 12 * month;
        }
        if (month == 12) {
            return money + money * 0.12f / 12 * month;
        }
        throw new IllegalArgumentException("月份不对");
    }
}

3>:最后直接测试

/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/5/13 16:12
 * Version 1.0
 * Params:
 * Description:
*/

public class Client  {
    public static void main(String[] args){
        /*// 这个就是策略模式,就是把支付宝、人众金服的计算方法分离出来,需要计算哪个,就去new 哪个对象,如下边的写法
        IFinance finance = new RenzhongFinance() ;
//        IFinance finance = new ZhifubaoFinance() ;
        float money = finance.finance(12 , 10000) ;
        System.out.println("money =" + money);*/


        // 这里是采用上下文来写的,可以直接用上边的方式去写就可以
        IFinance finance = new RenzhongFinance() ;
        FinanceContext context = new FinanceContext(finance) ;
        float money = context.finance(12  ,10000) ;
        System.out.println("money =" + money);
    }
}

4>:下边写一个FinanceContext类,类似于Android中的 Context,这个类有点多余,可以不用去看它

/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/5/13 15:55
 * Version 1.0
 * Params:
 * Description: 这个类有点多余,可以不写
 *              策略模式的上下文,类似于 android 中的 Context,
 *              可以通过这个FinanceContext 获取一些额外的基本信息 - 和理财有关的
*/

public class FinanceContext {
    private IFinance finance ;
    public FinanceContext(IFinance finance){
        this.finance = finance ;
    }


    public float finance(int month , int money){
        return finance.finance(month , money) ;
    }
}

4. 策略设计模式应用场景


1>:开发中使用场景:

  • a:ImageLoader的生成图片文件的命名策略;


    ImageLoader的生成图片文件的命名策略.png

意思就是:
如果服务器中有一张图片,叫做 2.png,然后你需要把它下载下来并且保存到本地磁盘中,这个时候需要对它进行重新命名,比如有2种命名方式:Md5和HashCode两种方式,下边这两种名称只是自己作为例子随便起的名字,可以是任意名称:
如果是Md5:可以叫做 0x0011.png;
如果是HashCode:可以叫做 HashCode xxx.png;

  • b:Gilde的缓存策略;
  • c:一开始写的3套网络框架:XUtils、OkHttp、Retrofit;
  • d:timer日志打印工具;
  • e:OkHttp的部分;

2>:源码中使用场景:

  • a:属性动画源码中的 setInterpolator差值器;
  • b:RecyclerView中的setLayoutManager:可以是 ListView样式、也可以是GridView样式的,可以是横向的、也可以是纵向的;

总之:如果写了好几套东西的话,并且可以来回切换的,都是采用的是策略设计模式的

具体代码已上传至github:
https://github.com/shuai999/Architect_day13.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,856评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,796评论 19 139
  • 安卓编译apk 时 出现下面的错误 > Error:Execution failed for task ':app...
    NikoKVCS阅读 2,875评论 0 0
  • 莫名的伤心难过,终于忍不住了,抑制住内心的委屈,不想哥哥跟着担心,挂完电话嚎啕大哭,还好闺蜜在,及时的安慰心里好受...
    陈玲_0029阅读 1,267评论 0 0
  • 谨以此文,献给天下已经远行的父亲。 你们在比远方更远的地方,是否依然安好…… 又是父亲节,总有一些孩子如...
    借山居五蕴寻物造物阅读 3,375评论 0 1