首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何用策略模式干掉 if-else

如何用策略模式干掉 if-else

作者头像
王小明_HIT
发布于 2022-06-14 16:30:40
发布于 2022-06-14 16:30:40
7040
举报
文章被收录于专栏:程序员奇点程序员奇点

如何用策略模式干掉 if-else

日常编码过程中遇到很多的 if-else ,代码扩展性和阅读性会受到影响,代码中常常使用策略模式代替 if-else

代码示例:

代码语言:javascript
复制
  /**
     * 上传文件
     *
     * @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 类:

代码语言:javascript
复制
 public abstract class StorageStrategy{
     public abstract void uploadFile(String file);
 }

第二步:实现基类

让所有业务实现基类接口

代码语言:javascript
复制
public class FtpStorageStrategy extends StorageStrategy {
    @Override
    public void uploadFile(String file) {
        System.out.println("文件" + file + "已上传到 ftp服务器");
    }
}

第三步:查表方式选择基类

既然事查表,当然需要在将创建的处理类,放到一个容器中,这里使用 map,将所有的策略放到一个容器中。

代码语言:javascript
复制
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);
    }
}

第四步:使用

代码语言:javascript
复制
public class Client {

    public static void main(String[] args) {
        // 获取策略
       StorageStrategy strategy = Factory.strategyMap.get("FTP")
       // 执行策略
       strategy.uploadFile("策略模式.txt");
}
参考资料
  • https://cloud.tencent.com/developer/article/1658355
  • https://juejin.cn/post/6844904022072262670
  • https://www.cnblogs.com/ssskkk/p/13939526.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 如何用策略模式干掉 if-else
  • 第一步:创建基类
  • 第二步:实现基类
  • 第三步:查表方式选择基类
  • 第四步:使用
    • 参考资料
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档