1.定义
- 定义一些列的算法,每一个都封装起来,并且可以互相替换
- 外层使用者无需感知算法的变化
2.UML类图
- 角色说明:
IStrategy : 策略的抽象接口
BusStrategy / CarStrategy : 具体策略类
CalculatorContext : 用来操作策略的上下文环境
3.UML实例代码
/**
* Copyright (C), 2016-2020
* FileName: IStrategy
* Author: wei.zheng
* Date: 2019/12/5 20:24
* Description: 策略类抽象接口, 计算不同交通工具需要的费用
*/
public interface IStrategy {
int calculatePrice(int distance);
}
/**
* Copyright (C), 2016-2020
* FileName: BusStrategy
* Author: wei.zheng
* Date: 2019/12/5 20:25
* Description: 公共汽车策略
*/
public class BusStrategy implements IStrategy {
/* 1块钱起步, 每5公里加1块 */
@Override
public int calculatePrice(int distance) {
if (distance <= 0) {
return 0;
}
return 1 + distance / 5;
}
}
/**
* Copyright (C), 2016-2020
* FileName: CarStrategy
* Author: wei.zheng
* Date: 2019/12/5 20:26
* Description: 小汽车策略类
*/
public class CarStrategy implements IStrategy {
/* 10块钱起步,每公里加1块 */
@Override
public int calculatePrice(int distance) {
return 10 + 1 * distance;
}
}
/**
* Copyright (C), 2016-2020
* FileName: CalculatorContext
* Author: wei.zheng
* Date: 2019/12/5 20:28
* Description: 策略Context类
*/
public class CalculatorContext {
private IStrategy mStrategy;
public void setStrategy(IStrategy strategy) {
this.mStrategy = strategy;
}
public int calculatePrice(int distance) {
return mStrategy.calculatePrice(distance);
}
}
/**
* 策略模式使用示例
*/
private void testStrategyPattern() {
mCalculatorContext = new CalculatorContext();
mCalculatorContext.setStrategy(new BusStrategy());
int busPrice = mCalculatorContext.calculatePrice(20);
mCalculatorContext.setStrategy(new CarStrategy());
int carPrice = mCalculatorContext.calculatePrice(20);
Log.d(TAG, "busPrice:" + busPrice + ", carPrice:" + carPrice);
}
4.总结
策略模式是使用最频繁的设计模式之一,遵循开闭原则,扩展方便。
如何满足开闭原则? 即:定义抽象、注入不同实现!
适用与if-else或者switch - case 分支较多的场景。