Java中常用的设计模式【策略模式】

简介: 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

优点

  1. 算法可以自由切换。
  2. 避免使用多重条件判断。
  3. 扩展性良好。

缺点

  1. 策略类会增多。
  2. 所有策略类都需要对外暴露。

使用场景

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

一、实现方式

假设一个场景,我们在电商系统中,订单分为很多种,例如:普通订单,秒杀订单,拼团订单等等。我们需要创建一个订单的时候,由于订单的类型不同,我们需要根据订单的类型执行不同的业务逻辑。

  • 1、订单类型枚举类
package com.asurplus.common.strategy;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * 订单类型枚举类
 */
@Getter
@AllArgsConstructor
public enum OrderTypeEnum {
    COMMON(1001, "普通订单"),
    SECKILL(1002, "秒杀订单"),
    SPELL(1003, "拼团订单");
    int type;
    String desc;
}

我们的订单分为三种,普通订单,秒杀订单,拼团订单。

  • 2、订单处理接口
package com.asurplus.common.strategy;
/**
 * 订单处理接口
 */
public interface OrderService {
    /**
     * 创建订单
     *
     * @return
     */
    void createOrder();
    /**
     * 获取订单类型
     *
     * @return
     */
    OrderTypeEnum type();
}
  • 3、普通订单处理器
package com.asurplus.common.strategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
 * 普通订单处理器
 */
@Slf4j
@Service
public class CommonOrderServiceImpl implements OrderService {
    @Override
    public void createOrder() {
        log.info("创建 普通订单");
    }
    @Override
    public OrderTypeEnum type() {
        return OrderTypeEnum.COMMON;
    }
}
  • 4、秒杀订单处理器
package com.asurplus.common.strategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
 * 秒杀订单处理器
 */
@Slf4j
@Service
public class SeckillOrderServiceImpl implements OrderService {
    @Override
    public void createOrder() {
        log.info("创建 秒杀订单");
    }
    @Override
    public OrderTypeEnum type() {
        return OrderTypeEnum.SECKILL;
    }
}
  • 5、拼团订单处理器
package com.asurplus.common.strategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
 * 拼团订单处理器
 */
@Slf4j
@Service
public class SpellOrderServiceImpl implements OrderService {
    @Override
    public void createOrder() {
        log.info("创建 拼团订单");
    }
    @Override
    public OrderTypeEnum type() {
        return OrderTypeEnum.SPELL;
    }
}
  • 6、下单管理器
package com.asurplus.common.strategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional;
/**
 * 订单管理器
 */
@Component
public class OrderManager {
    /**
     * Autowired 注解的强大之处
     */
    @Autowired
    private List<OrderService> orderServices;
    /**
     * 创建订单
     *
     * @param type 订单类型
     * @return
     */
    public void createOrder(int type) {
        /**
         * 根据订单类型,找到对应的处理器
         */
        Optional<OrderService> any = orderServices.stream().filter(f -> f.type().getType() == type).findAny();
        /**
         * 没有对应的处理器
         */
        if (!any.isPresent()) {
            throw new RuntimeException("没有找到相应的订单实现");
        }
        // 创建订单
        any.get().createOrder();
    }
}

这里就能体现出 @Autowired 的强大之处,可以一次性自动注入多个对象。根据订单类型,选出对应的处理器来处理该订单。

二、测试

  • 1、引入依赖
<!-- 测试依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>
  • 2、测试用例
package com.asurplus.common.strategy;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
 * 策略模式
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMain {
    @Autowired
    private OrderManager orderManager;
    @Test
    public void test() {
        // 创建 秒杀订单
        orderManager.createOrder(OrderTypeEnum.SECKILL.getType());
    }
}

输出结果


目录
相关文章
|
2天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
11 2
|
14天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
31 0
[Java]23种设计模式
|
23天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
27 3
|
23天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
26 2
|
25天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
59 3
|
26天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
27 3
|
25天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
26 1
|
26天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
16 2
|
27天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
在PHP开发中,设计模式是提高代码可读性、可维护性和扩展性的重要工具。本文将深入探讨策略模式这一行为型设计模式,通过分析其定义、结构、使用场景以及在PHP中的实际应用,帮助开发者更好地理解和运用策略模式来优化自己的项目。不同于传统摘要的简洁概述,本文摘要部分将详细阐述策略模式的核心理念和在PHP中的实现方法,为读者提供清晰的指引。
|
30天前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)