目录
一:抽取多态公共属性
多态概念,这么多实现层,肯定抽象出一个通用属性,进行判断各实现层的区别:
例如:
@Data
@AllArgsConstructor
public class MessageInfo {
// 消息类型
private MsgTypeEnum type;
// 消息内容
private String content;
}
type对应的枚举类:
扫描二维码关注公众号,回复:
16608191 查看本文章
public enum MsgTypeEnum {
TEXT(1, "文本"),
IMAGE(2, "图片"),
VIDEO(3, "视频");
public final int code;
public final String name;
MsgTypeEnum(int code, String name) {
this.code = code;
this.name = name;
}
}
二:封装多态接口类
父类:
public interface MessageStrategy {
void handleMessage(MessageInfo messageInfo);
}
子类1:
@Service
@MsgTypeHandler(value = MsgTypeEnum.TEXT)
public class TextMessageStrategy implements MessageStrategy {
@Override
public void handleMessage(MessageInfo messageInfo) {
System.out.println("处理文本消息 " + messageInfo.getContent());
}
}
子类2:
@Service
@MsgTypeHandler(value = MsgTypeEnum.IMAGE)
public class ImageMessageStrategy implements MessageStrategy {
@Override
public void handleMessage(MessageInfo messageInfo) {
System.out.println("处理图片消息 " + messageInfo.getContent());
}
}
可以看到上面我们用了一个MsgTypeHandler注解来表明策略类是用来处理哪种消息的?
@Documented
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MsgTypeHandler {
MsgTypeEnum value();
}
三:demo测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
private Map<MsgTypeEnum, MessageStrategy> messageStrategyMap;
@Resource
private void setMessageStrategyMap(List<MessageStrategy> messageStrategies) {
messageStrategyMap = messageStrategies.stream().collect(
Collectors.toMap(item -> AnnotationUtils.findAnnotation(item.getClass(), MsgTypeHandler.class).value(), v -> v));
}
@Test
public void contextLoads() {
MessageInfo messageInfo = new MessageInfo(MsgTypeEnum.TEXT, "这是一个文本消息");
MessageStrategy messageStrategy = messageStrategyMap.get(messageInfo.getType());
// 处理文本消息 这是一个文本消息
messageStrategy.handleMessage(messageInfo);
}
}
在setMessageStrategyMap方法上加@Resource注解,将消息类型及其对应的策略类保存到map中,当消息来临的时候就能从map中获取到对应的策略类,然后处理消息
参考博客
[1]https://juejin.im/post/5c5172d15188256a2334a15d