STRATEGY 模式
一.定义
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
二.类图
image.png三.实现
package cn.zzf.strategy;
/**
* @author GaoFeng2017
* @date 2018-06-04 21:50:43
**/
public class ArrayHandler implements Handler {
@Override
public void handle(String content) {
System.out.println(content + ",已被转换为数组对象");
}
}
package cn.zzf.strategy;
import java.io.Closeable;
/**
* @author GaoFeng2017
* @date 2018-06-04 21:07:44
**/
public class ExcelReader {
public ExcelReader() {
init();
}
private void init() {
System.out.println("excel读取器初始化中");
}
public void read(Handler handler,int index) {
handler.handle("读取到第" + index + "行的Excel文本");
}
public void close() {
System.out.println("释放资源");
}
}
package cn.zzf.strategy;
/**
* @author GaoFeng2017
* @date 2018-06-04 21:16:55
**/
interface Handler {
void handle(String content);
}
package cn.zzf.strategy;
/**
* @author GaoFeng2017
* @date 2018-06-04 21:51:40
**/
public class MapHandler implements Handler {
@Override
public void handle(String content) {
System.out.println(content + ",已被转为map对象");
}
}
package cn.zzf.strategy;
/**
* @author GaoFeng2017
* @date 2018-06-04 21:55:33
**/
public class Test {
public static void main(String[] args) {
ExcelReader reader = new ExcelReader();
reader.read(new ArrayHandler(),1);
reader.read(new MapHandler(),2);
reader.close();
}
}
运行结果
excel读取器初始化中
读取到第1行的Excel文本,已被转换为数组对象
读取到第2行的Excel文本,已被转为map对象
释放资源
分析
整个实现很简单,ExcelReader类模拟读取excel文件,并通过handler策略类来解析读取到的excel文本。在ExcelReader的read方法中,需要一个具体的算法来处理读取后的excel文本,我们可能把这些文本解析成bean,也可能解析成数组,还可能解析成map对象,而ArrayHandler和MapHandler正是解析策略的实现,最重要的是,策略对象以参数的形式传递使用,耦合度是非常低的。
四.总结
策略模式运用了面向对象的多态性,把具体算法委托给接口,通过组合的方式来实现解耦,完全遵循了DIP原则。在该模式中,每个具体的策略实现都可以当做参数来使用,这对于同一个问题来说,可以有不同的算法具体实现。另外,我们写框架时,有些逻辑是不确定的,它们有很多种情况,这个时候可以对外暴露一个接口,让框架使用者针对这个接口实现具体逻辑,再交给框架调用。
网友评论