如何用策略模式干掉 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"); }