实战!工作中常用到哪些设计模式

4a3b729a2a234f4907f38a47a0e1dd8e.png

若有收获,请记得分享和转发哦

前言

平时我们写代码呢,多数情况都是流水线式写代码,基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢,我觉得,最好的方式就是:使用设计模式优化自己的业务代码。今天跟大家聊聊日常工作中,我都使用过哪些设计模式。

edb8fbf4874386612d9fe37b24a18623.png

2b7e9ed6f5b88db98a42a2e6d8872b46.png

策略模式怎么使用呢?酱紫实现的:

  • 一个接口或者抽象类,里面两个方法(一个方法匹配类型,一个可替换的逻辑实现方法)

  • 不同策略的差异化实现(就是说,不同策略的实现类)

  • 使用策略模式

1.3.1 一个接口,两个方法
public interface IFileStrategy {
    
    //属于哪种文件解析类型
    FileTypeResolveEnum gainFileType();
    
    //封装的公用算法(具体的解析方法)
    void resolve(Object objectparam);
}
1.3.2 不同策略的差异化实现

A 类型策略具体实现

@Component
public class AFileResolve implements IFileStrategy {
    
    @Override
    public FileTypeResolveEnum gainFileType() {
        return FileTypeResolveEnum.File_A_RESOLVE;
    }

    @Override
    public void resolve(Object objectparam) {
      logger.info("A 类型解析文件,参数:{}",objectparam);
      //A类型解析具体逻辑
    }
}

B 类型策略具体实现

@Component
public class BFileResolve implements IFileStrategy {
   
    @Override
    public FileTypeResolveEnum gainFileType() {
        return FileTypeResolveEnum.File_B_RESOLVE;
    }


    @Override
    public void resolve(Object objectparam) {
      logger.info("B 类型解析文件,参数:{}",objectparam);
      //B类型解析具体逻辑
    }
}

默认类型策略具体实现

@Component
public class DefaultFileResolve implements IFileStrategy {

    @Override
    public FileTypeResolveEnum gainFileType() {
        return FileTypeResolveEnum.File_DEFAULT_RESOLVE;
    }

    @Override
    public void resolve(Object objectparam) {
      logger.info("默认类型解析文件,参数:{}",objectparam);
      //默认类型解析具体逻辑
    }
}
1.3.3 使用策略模式

如何使用呢?我们借助spring的生命周期,使用ApplicationContextAware接口,把对用的策略,初始化到map里面。然后对外提供resolveFile方法即可。

/**
 *  @author 公众号:捡田螺的小男孩
 */
@Component
public class StrategyUseService implements ApplicationContextAware{

  
    private Map<FileTypeResolveEnum, IFileStrategy> iFileStrategyMap = new ConcurrentHashMap<>();

    public void resolveFile(FileTypeResolveEnum fileTypeResolveEnum, Object objectParam) {
        IFileStrategy iFileStrategy = iFileStrategyMap.get(fileTypeResolveEnum);
        if (iFileStrategy != null) {
            iFileStrategy.resolve(objectParam);
        }
    }

    //把不同策略放到map
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Map<String, IFileStrategy> tmepMap = applicationContext.getBeansOfType(IFileStrategy.class);
        tmepMap.values().forEach(strategyService -> iFileStrategyMap.put(strategyService.gainFileType(), strategyService));
    }
}

391478cc36a91f07654de018a0ce0046.png

7d637087c460e27d21b45838166965f2.png

b12cff27c7bd773decb819117fbda952.png

b5e531cb52c57ba12d96ca6b710e10b3.png

打个比喻:

假设你晚上去上选修课,为了可以走点走,坐到了最后一排。来到教室,发现前面坐了好几个漂亮的小姐姐,于是你找张纸条,写上:“你好, 可以做我的女朋友吗?如果不愿意请向前传”。纸条就一个接一个的传上去了,后来传到第一排的那个妹子手上,她把纸条交给老师,听说老师40多岁未婚...

2.3 责任链模式使用

ba3070f3ee9c30bbc5134379df70802c.png

3951b3be56ff0090c44465869f058618.png

d2587662d1b943bdd3532edc3651f15b.png

2f23b60ec0172dee171274db22b295a2.png

17925a773f0a1096ad4dce666acd4ea7.png

7400a1add4e2c7afd884314bd78a1071.png

430b57238086f945752fbb77a73f2148.png

54a7042cf67bebf00c80928e85285da5.png

b09a680ec8c17fc92547031fa574c421.png

fac516b17abd088e3d413948c1eda4cd.png

33f459974842eb51ee727a99e2e0ffc9.png

410d765ddb15561e23b3cecb52cbf25f.png

f31c895f8d8d6b6ae26bcbcc941f11e3.png

32d6fd9fd04ee73fc12efbae758b00b1.png

6726a76b5157ff3a1a262e840d4c23af.png

a9fa24b99c291fe9d6aca4593407bb2f.png

72ff0a27be8ecd0a11e8f653abe7afa3.png

a87a7ad40afc88ae6ca557940fc86958.png

04d162ca0ed4ae9bd8f322d12534e8be.png

e1ac356e4555b2d77c62f7913893f008.png

a48935decdc97c8b2dd8f1020bd3eed0.png

3d95ba4a0889db97de605599e1956d8d.png

e9666a811fab5e1f9799e9a1ef9e2909.png

2b72d7a30dd6194ca4830c9a9bf757d0.png

85aeec2e73e4b3ba4e372cd670b02d0b.png

26c8309df38a8cab40a5c882cef2d387.png

66f0ae70a8f9c6023d980f8c751c5618.png

静态内部类的实现方式,效果有点类似双重校验锁。但这种方式只适用于静态域场景,双重校验锁方式可在实例域需要延迟初始化时使用。

6.2.4 枚举
public enum SingletonEnum {

    INSTANCE;
    public SingletonEnum getInstance(){
        return INSTANCE;
    }
}

枚举实现的单例,代码简洁清晰。并且它还自动支持序列化机制,绝对防止多次实例化。

5d9409aee84d997dd2d4eae2f9466d1f.png

轻松一刻,欣赏美景

15a5224dfd7aed5ef2003bcd94ec67b2.png

点击下方

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值