持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
设计模式三大类:
- 创建型
- 结构型
- 行为型
策略模式属于行为型的设计模式
策略模式使用场景:
在有多种算法相似的情况下,使用 if...else 所带来的代码复杂度提升和难以维护,此时可以使用策略模式。
也就是说策略模式可以在多if-else 代码场景中发挥作用。
如何用策略模式干掉 if-else
日常编码过程中遇到很多的 if-else
,代码扩展性和阅读性回受到影响,代码中常常使用策略模式代替 if-else
策略模式
代码示例:
/**
* 上传文件
*
* @param storageType 文件存储方式
* @param file 文件
*/
public void uploadFile(String storageType, String file) {
if (storageType.equals(LOCAL)) {
System.out.println("文件" + file + "已上传到 本地服务器");
} else if (storageType.equals(FTP)) {
System.out.println("文件" + file + "已上传到 ftp服务器");
} else if (storageType.equals(FASTDFS)) {
System.out.println("文件" + file + "已上传到 fastdfs服务器");
} else if (storageType.equals(HDFS)) {
System.out.println("文件" + file + "已上传到 hdfs服务器");
} else {
System.out.println("输入的文件存储类型错误");
}
}
第一步:创建基类
如果看到上面代码,要怎么优化,抽象一层, 搞个 Base 类:
public abstract class StorageStrategy{
public abstract void uploadFile(String file);
}
第二步:实现基类
让所有业务实现基类接口
public class FtpStorageStrategy extends StorageStrategy {
@Override
public void uploadFile(String file) {
System.out.println("文件" + file + "已上传到 ftp服务器");
}
}
第三步:查表方式选择基类
既然事查表,当然需要在将创建的处理类,放到一个容器中,这里使用 map
,将所有的策略放到一个容器中。
public class Factory {
private static Map<String,StorageStrategy> strategyMap = new ConcurrentHashMap<>();
public static void register(String name,StorageStrategy strategy){
strategyMap.put(name,strategy);
}
public static StorageStrategy getInvokeStrategy(String name){
return strategyMap.get(name);
}
}
第四步:使用
public class Client {
public static void main(String[] args) {
// 获取策略
StorageStrategy strategy = Factory.strategyMap.get("FTP")
// 执行策略
strategy.uploadFile("策略模式.txt");
}
通过上述就可以通过查表的方式获取对应的 strategy
这样就避免了 if else
判断