文章目录
- 1、策略模式介绍
- 2、使用场景
- 3、UML 类图
- 4、策略模式的简单实现
- 1)文件结构
- 2)CalculateStrategy 接口文件
- 3)BusStrategy 公交收费策略
- 4)地铁收费策略
- 5)MainActivity 调用不同 收费策略
- 6) log打印
1、策略模式介绍
1)实现某一功能可能会有不同的算法,不同的策略。我们根据不同的实际情况,选择不同的策略。
2)策略模式定义了一系列的算法,并将每个算法封装起来,并且他们还都可以相互替换。
2、使用场景
1)针对同一类型问题的多种处理方式,仅仅是具体行为的差别。
2)需要安全的封装多种同意类型的操作
3)在需要使用 if else switch case 的地方
3、UML 类图
4、策略模式的简单实现
举个示例 :
以创建公交车 和 地铁 收费系统为例。
如果使用 if-else switch-case 在代码里进行 判断,会导致 很大的冗余,并且 以后添加、修改都是比较麻烦的。
我们可以把每种算法独立成一个函数,然后外部调用对应的方式即可。
1)文件结构
(1)CalculateStrategy 接口文件 定义了接口的类型
(2)BusStrategy 汽车的收费的方式
(3)SubwayStrategy 地铁的收费方式
(4)MainActivity 调用不同收费的地方
2)CalculateStrategy 接口文件
package com.example.ubuntu.mycalculatestragegy;
public interface CalculateStrategy {
int calculatePrice(int km) ;
}
3)BusStrategy 公交收费策略
package com.example.ubuntu.mycalculatestragegy;
//公交车计算价格的策略
public class BusStrategy implements CalculateStrategy {
private String TAG = "BusStrategy: ";
//假设十公里以内1 元,超过十公里 每加亿元乘坐 5 公里
@Override
public int calculatePrice(int km) {
int extraTotal = km - 10; //超过十公里的总距离
int extraFactor = extraTotal / 5; //超出的距离是 5的 几倍
int fraction = extraFactor % 5; //超过的距离对 5 公里取余
int price = 1 + extraFactor * 1; //价格计算
System.out.println(TAG + "汽车 价格");
return fraction > 0 ? ++price : price;
}
}
4)地铁收费策略
package com.example.ubuntu.mycalculatestragegy;
public class SubwayStrategy implements CalculateStrategy {
private String TAG = "SubwayStrategy: ";
//地铁价格计算策略
/*
* 6Km 内 3 元
* 6~12km 4 元
* 12~22km 5 元
* 22~32Km 6 元
* */
@Override
public int calculatePrice(int km) {
System.out.println(TAG + "地铁 价格");
if (0 < km && km <= 6) {
return 3;
} else if (km > 6 && km < 12) {
return 4;
} else if (km > 12 && km < 22){
return 5;
} else if(km > 22 && km < 32){
return 6;
} else {
return 7;
}
}
}
5)MainActivity 调用不同 收费策略
package com.example.ubuntu.mycalculatestragegy;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends Activity {
private String TAG = "MainActivity: ";
private CalculateStrategy calculateStrategy;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
calculateStrategy = (CalculateStrategy) new BusStrategy();
System.out.println(TAG + "car price:" + calculateStrategy.calculatePrice(20));
calculateStrategy = (CalculateStrategy) new SubwayStrategy();
calculateStrategy.calculatePrice(20);
System.out.println(TAG + "subway price:" + calculateStrategy.calculatePrice(20));
}
}
6) log打印
传入相同参数 但是 显示价格却是不一样的。
文献参考:
Android 源码设计模式解析与实战 第二版
本人郑重声明,本博客所编文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。