什么是策略设计模式?
策略模式定义了一系列算法,并将每一个算法封装起来,而且是他们之间可以相互切换,让算法独立于使用它的客户而独立变化。
分析下定义,策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到最后一句话的目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口。
参考文章:
https://www.cnblogs.com/MrRightZhao/p/8000421.html
https://blog.csdn.net/u012124438/article/details/70039943/
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
策略模式的典型代码如下:
抽象策略类:
public interface Strategy {
/**
* 策略方法
*/
public void strategyInterface();
}
具体策略类:
public class ConcreteStrategyA implements Strategy {
@Override
public void strategyInterface() {
//相关的业务
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public void strategyInterface() {
//相关的业务
}
}
环境角色类:
public class Context {
//持有一个具体策略的对象
private Strategy strategy;
/**
* 构造函数,传入一个具体策略对象
* @param strategy 具体策略对象
*/
public Context(Strategy strategy){
this.strategy = strategy;
}
/**
* 策略方法
*/
public void contextInterface(){
strategy.strategyInterface();
}
}
然后我们举一个开车的案例,实现效果就是,给小明传什么car,小明就会开什么车。
策略设计模式案例:开车
1.抽象策略类:CarStrategy(是一个接口,Strategy角色)
/**
* 1.抽象策略类:CarStrategy接口
*/
public interface CarStrategy {
/**
* 策略方法
*/
void run();
}
2.具体策略类:SmallCarConcreteStrategy和TruckCarConcreteStrategy(ConcreteStrategy角色)
/**
* 2.具体策略实现子类-SmallCarConcreteStrategy
*/
public class SmallCarConcreteStrategy implements CarStrategy {
@Override
public void run() {
//相关的业务
System.out.println("今天开着小汽车去旅游");
}
}
public class TruckCarConcreteStrategy implements CarStrategy {
@Override
public void run() {
//相关的业务
System.out.println("今天开着大卡车去拉货");
}
}
3.应用场景类:PersonContext(Context角色)
/**
* 3.应用场景类
*/
public class PersonContext {
private String name; //姓名
private Integer age; //年龄
private CarStrategy car; //拥有车
public PersonContext(String name, Integer age) {
this.name = name;
this.age = age;
}
public void setCar(CarStrategy car) {
this.car = car;
}
public void driver() {
if (car != null) {
System.out.print(name + " " + age + " 岁 ");
car.run();
} else {
System.out.println("error: car = null");
}
}
}
4.StrategyTest测试类:
public class StrategyTest {
public static void main(String[] args) {
PersonContext p1 = new PersonContext("小明", 22);
//Context: 用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。
SmallCarConcreteStrategy smallCar = new SmallCarConcreteStrategy();
TruckCarConcreteStrategy truckCar = new TruckCarConcreteStrategy();
p1.driver();
p1.setCar(smallCar);
p1.driver();
p1.setCar(truckCar);
p1.driver();
}
}
控制台输出:
error: car = null
小明 22 岁 今天开着小汽车去旅游
小明 22 岁 今天开着大卡车去拉货
Android中策略模式应用场景
- Glide 的缓存策略
- ImageLoader 的生成图片文件的命名策略
- 网络切换和缓存切换策略
- Timer日志打印工具也用到策略模式
- Okhttp部分也用到
- 属性动画,set方法对插值器进行设置
- RecyclerView的setLayoutManager方法
END.
网友评论