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
