Java中常用的设计模式之策略模式详解

网友投稿 268 2022-08-25


Java中常用的设计模式之策略模式详解

目录优点缺点使用场景一、实现方式1、订单类型枚举类2、订单处理接口3、普通订单处理器4、秒杀订单处理器5、拼团订单处理器6、下单管理器二、测试1、引入依赖2、测试用例总结

优点

1.算法可以自由切换。

2.避免使用多重条件判断。

3.扩展性良好。

缺点

1.策略类会增多。

2.所有策略类都需要对外暴露。

使用场景

1.如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2.一个系统需要动态地在几种算法中选择一种。

3.如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

一、实现方式

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

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 注解的强大之处

*/

@AglpOSmVUutowired

private List orderServices;

/**

* 创建订单

*

* @param type 订单类型

* @return

*/

public void createOrder(int type) {

/**

* 根据订单类型,找到对应的处理器

*/

Optional any = orderServices.stream().filter(f -> f.type().getType() == type).findAny();

/**

* 没有对应的处理器

*/

if (!any.isPresent()) {

throw new RuntimeException("没有找到相应的订单实现");

}

// 创建订单

any.get().createOrder();

}

}

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

二、测试

1、引入依赖

org.springframework.boot

spring-boot-starter-test

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());

}

}

输出结果

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Effective Python 2nd》 读书笔记——列表与字典(effective java)
下一篇:《流畅的Python》读书笔记——Python一等函数(优雅的python)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~