Java设计模式之策略模式解析

 更新时间:2023年10月21日 10:23:24   作者:浪浪山的猿  
这篇文章主要介绍了Java设计模式之策略模式解析,在策略模式中,一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模式,需要的朋友可以参考下

一. 简介

1. 什么是策略模式?

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

2. 策略模式的应用场景?

  • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
  • 一个系统需要动态地在几种算法中选择一种
  • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现

二. 策略模式的使用

我们来模拟一个商城系统创建不同活动的需求,假设我们需要根据传入的type来判断创建所要创建的活动,传统的方式我们可能或通过if()---else()的方式去判断索要创建的活动类类型,如果类型多的话这样的判断就会显得代码很凌乱。那么我们可以尝试着用策略模式去优化这种逻辑。

下面我们模拟三种不同活动的创建

  • 创建策略枚举类
/**
 * @author gf
 * @date 2023/2/7
 */
@Getter
@AllArgsConstructor
public enum ActivityTypeEnum {
 
    MANJIAN(101, "满减活动"),
    MANZHE(102, "满折活动"),
    PRESALE(103, "预售活动");
 
    int type;
 
    String desc;
 
}
  • 创建活动接口
/**
 * @author gf
 * @date 2023/2/7
 */
public interface ActivityService {
 
    /**
     * 创建活动
     *
     * @return
     */
    void createActivity();
 
    /**
     * 获取订单类型
     *
     * @return
     */
    ActivityTypeEnum type();
 
}
  • 创建活动实现类

接下来我们分别创建满减,满折和预售的实现类

  • 满减实现类:
/**
 * @author gf
 * @date 2023/2/7
 */
@Slf4j
@Service
public class ManJianActivityImpl implements ActivityService {
    @Override
    public void createActivity() {
        log.info("----创建满减活动----");
    }
 
    @Override
    public ActivityTypeEnum type() {
        return ActivityTypeEnum.MANJIAN;
    }
}
  • 满折实现类:
/**
 * @author gf
 * @date 2023/2/7
 */
@Slf4j
@Service
public class ManZheActivityImpl implements ActivityService {
    @Override
    public void createActivity() {
        log.info("----创建满折活动----");
    }
 
    @Override
    public ActivityTypeEnum type() {
        return ActivityTypeEnum.MANZHE;
    }
}
  • 预售实现类:
/**
 * @author gf
 * @date 2023/2/7
 */
@Slf4j
@Service
public class PreSaleActivityImpl implements ActivityService {
 
    @Override
    public void createActivity() {
        log.info("----创建预售活动----");
    }
 
    @Override
    public ActivityTypeEnum type() {
        return ActivityTypeEnum.PRESALE;
    }
}
  • 创建活动创建通用接口
/**
 * @author gf
 * @date 2023/2/7
 */
@RestController
public class ActivityController {
 
 
    @Autowired
    private List<ActivityService> activityService;
 
    /**
     * 创建活动
     *
     * @param type 活动类型
     * @return
     */
    public void createActivity(int type) {
        /**
         * 根据动类型,找到对应的处理器
         */
        Optional<ActivityService> any = activityService.stream().filter(f -> f.type().getType() == type).findAny();
        /**
         * 没有对应的处理器
         */
        if (!any.isPresent()) {
            throw new RuntimeException("没有找到相应的活动实现");
        }
        // 创建订单
        any.get().createActivity();
    }
 
}

测试活动创建

@SpringBootTest
class DesignApplicationTests {
 
 
    @Autowired
    private ActivityController activityController;
 
    @Test
    void contextLoads() {
        activityController.createActivity(ActivityTypeEnum.MANJIAN.getType());
        
    }
 
}

搞定,看是不是很方便,省去了很多的if--else的判断和接口的注入

三. 策略模式的优缺点

优点:

  • 算法可以自由切换;
  • 避免使用多重判断;
  • 拓展性良好,增加一个策略只需要实现接口即可;

缺点:

  • 策略类数量会增多,每个策略都是一个类,复用性很小;
  • 所有的策略类都需要对外暴露

到此这篇关于Java设计模式之策略模式解析的文章就介绍到这了,更多相关Java策略模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot常用注解及作用说明

    Springboot常用注解及作用说明

    这篇文章主要介绍了Springboot常用注解及作用说明,Springboot开发中注解是非常重要的不可或缺的,那么Springboot中有哪些常用的注解呢,今天我们就来看一下这些注解和其作用,需要的朋友可以参考下
    2023-08-08
  • 2022年最新java 8 ( jdk1.8u321)安装图文教程

    2022年最新java 8 ( jdk1.8u321)安装图文教程

    这篇文章主要介绍了2022年最新java 8 ( jdk1.8u321)安装图文教程,截止2022年1月,官方出的jdk1.8目前已更新到8u321的版本,本文通过图文并茂的形式给大家介绍安装过程,需要的朋友可以参考下
    2022-08-08
  • Dubbo3和Spring Boot整合过程源码解析

    Dubbo3和Spring Boot整合过程源码解析

    Dubbo首先是提供了一个单独的模块来和Spring Boot做整合,利用 Spring Boot自动装配的功能,配置了一堆自动装配的组件,本文介绍Dubbo3和Spring Boot整合过程,需要的朋友一起看看吧
    2023-08-08
  • Java实现Elasticsearch查询当前索引全部数据的完整代码

    Java实现Elasticsearch查询当前索引全部数据的完整代码

    这篇文章主要介绍了如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scroll),可以一次性获取满足条件的数据,而不需要限制每页的查询条数大小,这样可以避免因数据量过大而引发的性能问题,需要的朋友可以参考下
    2025-02-02
  • Spring Boot2深入分析解决java.lang.ArrayStoreException异常

    Spring Boot2深入分析解决java.lang.ArrayStoreException异常

    这篇文章介绍了Spring Boot2深入分析解决java.lang.ArrayStoreException异常的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 解决lombok的@Data注解无法打印继承的父类信息问题

    解决lombok的@Data注解无法打印继承的父类信息问题

    在Java编程中,使用@Data注解可能导致子类继承父类属性后,打印只显示子类信息不显示父类信息,问题源于@Data注解作用域仅限于当前类,解决方法包括使用@ToString(callSuper=true)注解或重写toString方法
    2024-11-11
  • JAVA 使用正则提取A标签以及href链接

    JAVA 使用正则提取A标签以及href链接

    这篇文章主要介绍了JAVA 使用正则提取A标签以及href链接的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java数据结构之HashMap源码深入分析

    Java数据结构之HashMap源码深入分析

    Java HashMap是一种基于哈希表实现的键值对存储结构,可以实现快速的数据查找和存储。它是线程不安全的,但在单线程环境中运行效率高,被广泛应用于Java开发中
    2023-04-04
  • Java图形界面开发之简易记事本

    Java图形界面开发之简易记事本

    这篇文章主要为大家详细介绍了Java图形界面开发之简易记事本的制作方法,,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Java中的位运算符全解

    Java中的位运算符全解

    这篇文章主要为大家详细介绍了Java中的位运算符,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论