前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于@Autowired和@PostConstruct实现策略模式

基于@Autowired和@PostConstruct实现策略模式

作者头像
小小明童鞋
发布2022-09-16 12:24:27
5060
发布2022-09-16 12:24:27
举报
文章被收录于专栏:java系列博客java系列博客
考研 or 工作 ?

`package com.example.demo.designpattern.strategy;

public enum FutureChose { KAOYAN("KAOYAN", "考研"), WORK("WORK","工作");

代码语言:javascript
复制
private String name;
private String desc;

FutureChose(String name, String desc) {
    this.name = name;
    this.desc = desc;
}

} `

interface

`package com.example.demo.designpattern.strategy;

public interface Handler {

代码语言:javascript
复制
String getType();

String execute(String param);

} `

考研

`package com.example.demo.designpattern.strategy;

import org.springframework.stereotype.Component;

@Component public class KaoyanStragy implements Handler{

代码语言:javascript
复制
[@Override](https://my.oschina.net/u/1162528)
public String getType() {
    return FutureChose.KAOYAN.name();
}

[@Override](https://my.oschina.net/u/1162528)
public String execute(String param) {
    return param +  "未来准备考研,勿扰";
}

} `

工作

`package com.example.demo.designpattern.strategy;

import org.springframework.stereotype.Component;

@Component public class WorkStragy implements Handler{

代码语言:javascript
复制
[@Override](https://my.oschina.net/u/1162528)
public String getType() {
    return FutureChose.WORK.name();
}

@Override
public String execute(String param) {
    return param +  "未来准备工作,勿扰";
}

} `

策略处理类
  • 项目启动时将 所有子类注入到handlerList
  • 项目启动时 将所有子类实现与枚举映射关系存储在hanlderMap

`package com.example.demo.designpattern.strategy;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors;

@Service public class StrategyMrt {

代码语言:javascript
复制
@Autowired
List<Handler> handlerList;

private Map<String,Handler> handlerMap;


@PostConstruct
private void init(){
    handlerMap= handlerList.stream().collect(Collectors.toMap(Handler::getType, Function.identity()));
}

/**
 *  根据传入枚举类型查找具体handler
 * @param futureChose
 * @return
 */
public Handler getHandler(FutureChose futureChose){
    return handlerMap.get(futureChose.name());
}

} `

测试

http://localhost:8080/handler/strategy?futureChose=KAOYAN

http://localhost:8080/handler/strategy?futureChose=WORK

如需新增新的策略,只需在枚举类中新增类型,新策略实现Handler即可
  • 例如 : 我不想考研,也不想工作,而是想创业

则做如下操作:

新增创业枚举

`package com.example.demo.designpattern.strategy;

public enum FutureChose { KAOYAN("KAOYAN", "考研"), CHUANGYE("CHUANGYE", "创业"), WORK("WORK","工作");

代码语言:javascript
复制
private String name;
private String desc;

FutureChose(String name, String desc) {
    this.name = name;
    this.desc = desc;
}

} `

新增创业实现

`package com.example.demo.designpattern.strategy;

import org.springframework.stereotype.Component;

@Component public class ChuangyeStragy implements Handler{

代码语言:javascript
复制
@Override
public String getType() {
    return FutureChose.CHUANGYE.name();
}

@Override
public String execute(String param) {
    return param +  "未来准备创业,勿扰";
}

} `

效果如下:

测试
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 考研 or 工作 ?
  • interface
  • 考研
  • 工作
  • 策略处理类
  • 测试
  • 如需新增新的策略,只需在枚举类中新增类型,新策略实现Handler即可
  • 新增创业枚举
  • 新增创业实现
  • 测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档