java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java策略模式

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

作者:浪浪山的猿

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

您可能感兴趣的文章:
阅读全文