当前位置: 首页 > article >正文

【设计模式】聊聊策略模式

策略模式的本质是为了消除if 、else代码,提供拓展点,对拓展开放,对修改关闭,也就是说我们开发一个功能的时候,要尽量的采用设计模式进行将不变的东西进行抽取出来,将变化的东西进行隔离开来,这样不仅仅可以减少bug,也可以提高开发效率。

策略的整体是策略类的定义、创建、使用三部分。

定义一个策略接口类。

public interface UserCache {

    public void cache();

}
public class LRUCache implements UserCache{

    @Override
    public void cache() {
        System.out.println("LRU算法");
    }

}
public class FIFOCache implements UserCache{

    @Override
    public void cache() {
        System.out.println("FIFO cache");
    }
}
public class CacheContext {

    private UserCache userCache;

    public CacheContext(UserCache userCache) {
        this.userCache = userCache;
    }


    public void run() {
        userCache.cache();
    }

}

测试类


        LRUCache lruCache = new LRUCache();
        CacheContext cacheContext = new CacheContext(lruCache);
        cacheContext.run();

可以发现通过将不同的策略进行抽取出来,利用面向接口编程的方式,进行编程。其实也可以不利用context,也可以利用查表法进行编程。

public class CacheFactory {
    
    private static Map<String,UserCache> cache = new ConcurrentHashMap<>();
    
    static {
        cache.put("LRU",new LRUCache());
        cache.put("LRU",new LRUCache());
    }
    
    public static void run (String cacheType) {
        if (Objects.isNull(cacheType)) {
            throw new RuntimeException("");
        }
        UserCache userCache = cache.get(cacheType);
        userCache.cache();
    }
    
}

其实在spring mvc中,比如解析不同的数据结构,xml、json等格式,都是进行抽象出高纬度的接口,然后根据配置进行查找对应的解析器进行处理,我们不一定要参考GOF的设计模式进行设计,一定要结合自身的业务实际来设计对象结构和逻辑,否则就不能灵活套用。

在说一个就是平时开发中为什么很少使用到设计模式,其实我们开发的大部分业务都不具备框架级别的可复用性,大多都是需求,一次性的,所以很少使用到。但是框架不一样,它需要考虑更重的适配性,不能说我都if、else 否则的话,那么缺少什么就需要进行编码调整,所以里面有各种的设计模式来提升程序的拓展性。

那么平时我们如何将学习到的设计模式使用到项目中,其实可以根据现有业务考虑,将不变的东西进行抽取,改变的东西进行拓展。但是也不要过度设计,否则为了编码的可拓展性,降低了可读性。设计一个精心的高拓展架构,其实本身就是一种权衡。架构设计亦是如此,软件设计也是如此。架构设计平衡的是在高性能、稳定性、可拓展上的权衡、软件设计则是在可读性、可拓展性、维护性权衡。


http://www.kler.cn/a/135912.html

相关文章:

  • 数据库管理系统——数据库设计
  • Apache Samza开源的分布式流处理框架
  • airflow docker 安装
  • 简洁清爽epub 阅读器
  • Python中的上下文管理器:从资源管理到自定义实现
  • Godot RPG 游戏开发指南
  • 碰到一个逆天表中表数据渲染
  • C语言——2.安装并使用VS
  • 力扣刷题-二叉树-二叉树的高度与深度
  • 搭建网关服务器实现DHCP自动分配、HTTP服务和免密登录
  • 【数据结构(三)】单向环形链表和约瑟夫问题(3)
  • trzsz支持文件拖动到终端进行上传,类似lrzsz
  • 后端返回 date 时间日期格式为 UTC 格式字符串,形如 2022-08-11T10:50:31.050+00:00前端如何修改为yyyy-mm-dd
  • 公司电脑文件透明加密、防泄密管理软件系统
  • ASP.NET限流器的简单实现
  • 贝锐蒲公英路由器X4C如何远程访问NAS?
  • 面试官:你能说说常见的前端加密方法吗?
  • 基于单片机16路抢答器仿真系统
  • Ubuntu 22.04安装Rust编译环境并且测试
  • 【运维篇】Redis常见运维命令详解
  • 数据处理生产环境_利用MurmurHash3算法在Spark和Scala中生成随机颜色
  • 今天遇到Windows 10里安装的Ubuntu(WSL)的缺点
  • 搜索引擎ElasticSearch分布式搜索和分析引擎学习,SpringBoot整合ES个人心得
  • 【Linux 源码阅读记录】设备树解析 of 相关代码
  • idea显示pom.xml文件漂黄警告 Dependency maven:xxx:xxx is vulnerable
  • Jenkins自动化部署(虚拟机部署)