注入多个实现类【JAVA】(设计模式之策略模式)项目实际场景【Spring boot】

在这里插入图片描述

📋业务场景


最近有一个场景消息发送处理 跟大家分享一下我实现方式

  • 发送消息就会涉及各种消息:图片消息,文字消息,视频消息等等…
  • 每种消息的数据结构可能还不同,所以这里用了设计模式里面策略模式

📖策略模式的概念


策略模式(Strategy Pattern)是一种行为设计模式,它允许在运行时选择算法的行为,而不是在编译时进行硬编码。该模式通过将算法封装到独立的类中,并使它们可以相互替换,从而实现了算法的独立变化和客户端的解耦。

  • 以下是策略模式的参与者角色:
    1. 上下文(Context):它维护一个对策略对象的引用,并在需要执行某个特定行为时,将请求委托给相关的策略对象。
    2. 策略(Strategy):它定义了一个公共接口,用于所有具体策略类的行为。上下文通过这个接口与具体策略类进行交互。
    3. 具体策略(Concrete Strategies):它实现了策略接口,并提供了具体的算法实现

🔖代码示例


1️⃣创建一个接口类


/**
 * @Author: hrd
 * @CreateTime: 2023/6/29 11:28
 * @Description:
 */
public interface Message {

    /**
     * 消息类型
     *
     * @return
     */
    int getMsgType();

    void handle(MessageBody messageBody);
}

2️⃣创建接口类的实现类


/**
 * @Author: hrd
 * @CreateTime: 2023/6/29 11:36
 * @Description:
 */
@Component
public class PicMessage implements Message{
    @Override
    public int getMsgType() {
        return 2;
    }

    @Override
    public void handle(MessageBody messageBody) {
        System.out.println("正在处理图片消息...");
        System.out.println("图片消息Json:"+messageBody.getMessage());

    }
}
/**
 * @Author: hrd
 * @CreateTime: 2023/6/29 11:30
 * @Description:
 */
@Component
public class TxtMessage implements Message{
    @Override
    public int getMsgType() {
        return 1;
    }

    @Override
    public void handle(MessageBody messageBody) {
        System.out.println("正在处理文字消息...");
        System.out.println("文字消息Json:"+messageBody.getMessage());

    }

}

3️⃣创建脚手架 box类


/**
 * @Author: hrd
 * @CreateTime: 2023/6/29 11:39
 * @Description:
 */
public class MsgHandleBox {
    private final Map<Integer, Message> map = new ConcurrentHashMap<>();

    public void setBean(List<Message> messages) {
        if (null != messages) {
            messages.forEach(this::put);
        }
    }

    private void put(Message message) {
        if (null != message) {
            map.put(message.getMsgType(), message);
        }
    }

    public Message get(int msgType){
        return map.get(msgType);
    }
}

4️⃣最后创建一个实现工厂类 MsgBeanFactory


@Component
public class MsgBeanFactory extends MsgHandleBox {

    @Autowired(required = false)
    @Override
    public void setBean(List<Message> messages) {
        super.setBean(messages);
    }

    @Override
    public Message get(int msgType) {
        return super.get(msgType);
    }
}

5️⃣测试代码


@SpringBootTest
class SpringbootBaseApplicationTests {

    @Autowired
    MsgBeanFactory msgBeanFactory;
    @Test
    void contextLoads() {
        List<MessageBody> m = new ArrayList<MessageBody>(){{
            add(new MessageBody("我是文字消息",1));
            add(new MessageBody("{\"url\":\"图片地址\",\"size\":\"图片大小\"}",2));
        }};

        for (MessageBody messageBody : m) {
            Message message = msgBeanFactory.get(messageBody.getType());
            message.handle(messageBody);
        }
    }

}

/**
 * @Author: hrd
 * @CreateTime: 2023/6/29 11:32
 * @Description:
 */

public class MessageBody {

    private String message;
    private int type;

    public MessageBody(String message, int type) {
        this.message = message;
        this.type = type;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }
}

6️⃣输出结果


正在处理文字消息...
文字消息Json:我是文字消息
正在处理图片消息...
图片消息Json:{"url":"图片地址","size":"图片大小"}

📈总结:


在上述示例中,Message 是策略接口,PicMessage TxtMessage 是具体的策略类。MsgBeanFactory 是上下文类,在这里可以选择不同的策略来加密数据。这样,如果日后需要添加更多的消息类型,只需创建新的策略类即可,而不需要修改现有的代码。

  • 优点:
    • 1 可以自由切换对应处理逻辑
    • 2 避免了大量的if判断,代码更加优雅了
    • 3 扩展性更好,有新的消息类型只需增加对应的新消息类,需要修改外围逻辑
  • 缺点
    • 类增多,代码复杂度提升
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用JPA提供的@Modifying和@Query注解,编写一个自定义的删除方法,如下所示: ``` @Modifying @Query("delete from User u where u.id in :ids") void deleteByIds(@Param("ids") List<Long> ids); ``` 其中,@Modifying注解表示该方法会修改数据,@Query注解表示该方法使用JPQL语句进行查询,@Param注解表示方法参数与JPQL语句中的参数对应。 在方法中,我们可以使用in关键字来批量删除指定id的数据,ids参数为一个Long类型的List,表示要删除的id列表。 使用该方法时,只需要传入要删除的id列表即可,如下所示: ``` List<Long> ids = Arrays.asList(1L, 2L, 3L); userRepository.deleteByIds(ids); ``` 其中,userRepository为JPA提供的Repository接口,可以直接调用我们自定义的删除方法。 ### 回答2: Java Spring Boot可以通过使用JpaRepository接口中的"deleteAllInBatch"方法来实现批量删除。 首先,需要在Repository接口中定义一个扩展自JpaRepository的自定义方法,用于批量删除数据。例如: ```java import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.example.demo.model.Entity; @Repository public interface EntityRepository extends JpaRepository<Entity, Long> { void deleteAllInBatch(Iterable<Entity> entities); } ``` 然后,在Service层或Controller层中引入这个Repository,并调用"deleteAllInBatch"方法来实现批量删除。例如: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.demo.repository.EntityRepository; @Service public class EntityService { private final EntityRepository entityRepository; @Autowired public EntityService(EntityRepository entityRepository) { this.entityRepository = entityRepository; } public void deleteEntitiesInBatch(Iterable<Entity> entities) { entityRepository.deleteAllInBatch(entities); } } ``` 最后,在使用这个Service的地方,传入要删除的实体对象集合,即可实现批量删除。例如: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.example.demo.model.Entity; import com.example.demo.service.EntityService; @RestController public class EntityController { private final EntityService entityService; @Autowired public EntityController(EntityService entityService) { this.entityService = entityService; } @DeleteMapping("/entities") public void deleteEntities(@RequestBody Iterable<Entity> entities) { entityService.deleteEntitiesInBatch(entities); } } ``` 以上就是使用Java Spring Boot实现批量删除的方法。 ### 回答3: 在Java Spring Boot实现批量删除可以通过以下步骤: 1. 首先,确保你已经创建了一个Spring Boot项目并配置好数据库连接。 2. 创建一个实体类,例如Student,用于表示需要删除的对象。添加必要的字段和注解,使其与数据库表映射。 3. 创建一个Repository接口,例如StudentRepository,继承自JpaRepository。这个接口将提供基本的CRUD操作方法。 4. 在Service层创建一个实现类,例如StudentService。注入StudentRepository来访问数据库。 5. 在Service中添加一个批量删除的方法,例如deleteStudents,接收一个包含要删除对象id的List作为参数。 6. 在deleteStudents方法中,使用JpaRepository的deleteAllByIdInBatch方法,将传入的id列表作为参数。这个方法会一次性批量删除给定的id对应的记录。 7. 在Controller层创建一个REST接口,例如StudentController,注入StudentService。 8. 在Controller中添加一个处理批量删除请求的方法,例如handleBatchDelete,接收一个包含要删除对象id的List作为参数。 9. 在handleBatchDelete方法中,调用StudentService的deleteStudents方法,并返回适当的响应。 这样,当客户端发送批量删除请求时,可以调用这个接口并传入一个包含要删除对象id的List作为参数,然后后端就会批量删除对应的记录。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值