最近学习设计模式,特此记录下来。
1.策略模式简介
- 在软件开发中也常常遇到这样子的情况:实现某一功能可能有多种算法或者策略,我们根据不同的策略或者算法来完成该功能。如排序算法 插入、归并、冒泡。
2.定义
- 策略模式定义一系列的算法,并将每个算法封装起来,而且使他们可以相互替换。策略模式让算法独立于他们的客户独立变化。
3.使用场景
- 正对同一类问题的多种处理方式,仅仅具体行为有差别时。
-需要安全的封装多种同意类型的操作时。
-出现同意抽象类有多个子类而且又需要使用 if-else 或者 switch-case 来选择具体子类时。
策略模式的UML类图
![%Q]E}MZB])HYC16_9J1ZBA0.png](http://upload-images.jianshu.io/upload_images/4314442-600309f5d6483c46.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- Context--- 用来操作策略上下文环境。
- Stragety-- 策略的抽象。
- ConcrecteStragetyA 、 ConcrecteStragetyA具体的策略实现。
4.策略的简单实现。
- 通常如果一个问题有多个解决方案,最简单的方法就是利用if-else 或者 switch-case 方式根据不同的场景选择不同的解决方案。
- 计算接口
public interface CalculatorStragety {
/**
* 按距离来计算价格
* @param km 距离
* @return 返回价格
*/
int calculator(int km);
}
- 公交车计算价格
public class Busstrategy implements CalculatorStragety {
@Override
public int calculator(int km) {
int extraTotl = km-10;
int extroFactor = extraTotl /5;
int fraction = extraTotl % 5;
int price = 1 + extroFactor*1;
return fraction > 0 ? ++price: price ;
}
}
- 地铁计算价格
public class Subwaytrategy implements CalculatorStragety {
@Override
public int calculator(int km) {
if (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;
}
}
}
- Context 角色类
public class Pricecalculator implements CalculatorStragety {
private CalculatorStragety stragety;
public static void main(String[] args) {
Pricecalculator culator = new Pricecalculator();
// 设置价格策略 Busstrategy
culator.setStragety(new Busstrategy());
System.out.println("calculator resutl = "+culator.calculator(30));
// 设置价格策略 Subwaytrategy
culator.setStragety(new Subwaytrategy());
System.out.println("calculator resutl = "+culator.calculator(30));
}
public void setStragety(CalculatorStragety stragety) {
this.stragety = stragety;
}
@Override
public int calculator(int km) {
return this.stragety.calculator(km);
}
}
- 最终打印结果是
calculator resutl = 5
calculator resutl = 6
总结
- 如果把那些逻辑都用if-else 或者 switch-case 来实现的话,整个类的代码臃肿逻辑复杂, 难以升级和维护。
而使用策略模式的话,则通过不同的策略实现算法替换, 在简化逻辑、结构的同时增强了可读性、稳定性和可扩展性代码更为直观。