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策略模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis事务如何跟Spring结合(数据库事务特性和Spring事务管理源码)

    Mybatis事务如何跟Spring结合(数据库事务特性和Spring事务管理源码)

    MyBatis与Spring的事务结合主要是通过Spring的事务管理和MyBatis的数据库操作来实现的,在本文中,我们将从数据库事务特性和Spring事务管理源码两个角度来分析MyBatis事务如何与Spring结合到一起的原理,感兴趣的朋友一起看看吧
    2024-01-01
  • Mybatis给数据库敏感字段加解密详解

    Mybatis给数据库敏感字段加解密详解

    这篇文章主要介绍了Mybatis给数据库敏感字段加解密详解,为了保护数据库敏感字段数据安全,有时候我们需要将敏感数据加密入库,查询时再解密成明文,我们可以利用Mybatis自定义TypeHandler来处理,需要的朋友可以参考下
    2023-11-11
  • Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重复读取配置文件的方法

    Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重复读取配置文

    这篇文章主要介绍了Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重复读取配置文件的方法,需要的朋友可以参考下
    2015-12-12
  • java三层架构原理与作用小结

    java三层架构原理与作用小结

    这篇文章主要对Java三层架构的概念、作用等进行了介绍,需要的朋友可以参考下
    2017-04-04
  • Spring源码完美导入IDEA的过程

    Spring源码完美导入IDEA的过程

    正值春节假期,小伙伴私信我idea导入spring源码的过程,今天抽空给大家整理一篇教程帮助大家学习Spring源码完美导入IDEA的详细过程,感兴趣的朋友一起看看吧
    2022-02-02
  • JavaCV实现照片马赛克效果

    JavaCV实现照片马赛克效果

    这篇文章主要介绍了如何通过JavaCV实现照片马赛克效果,文中的示例代码讲解详细,对我们学习JavaCV有一定的帮助,感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-01-01
  • 详解SpringMVC常用注解功能及属性

    详解SpringMVC常用注解功能及属性

    这篇文章主要介绍了详解SpringMVC注解功能及属性,文中通过详细的示例代码作了简要的分析,有需要的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09
  • SiteMesh如何结合Freemarker及velocity使用

    SiteMesh如何结合Freemarker及velocity使用

    这篇文章主要介绍了SiteMesh如何结合Freemarker及velocity使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • IDEA 中创建Spring Data Jpa 项目的示例代码

    IDEA 中创建Spring Data Jpa 项目的示例代码

    这篇文章主要介绍了IDEA 中创建Spring Data Jpa 项目的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Java toString方法使用超全讲解

    Java toString方法使用超全讲解

    在Java中所有的类都有一个共同的父类Object(默认继承,不用加extends关键字),toString方法就是Object类的一个方法,用来返回该对象的字符串表示形式,下面这篇文章主要给大家介绍了关于Java toString方法使用的相关资料,需要的朋友可以参考下
    2023-05-05

最新评论