成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

策略模式簡潔的實現方式,你知道嗎?

開發 前端
策略模式還挺簡單的,就是定義一個接口,然后有多個實現類,每種實現類封裝了一種行為。然后根據條件的不同選擇不同的實現類。

if else 太多了

最近跟著公司的大佬開發了一款IM系統,類似QQ和微信哈,就是聊天軟件。我們有一部分業務邏輯是這樣的。

if (msgType = "文本") {
// dosomething
} else if(msgType = "圖片") {
// doshomething
} else if(msgType = "視頻") {
// doshomething
} else {
// doshomething
}

就是根據消息的不同類型有不同的處理策略,每種消息的處理策略代碼都很長,如果都放在這種if else代碼快中,代碼很難維護也很丑,所以我們一開始就用了策略模式來處理這種情況。

策略模式還挺簡單的,就是定義一個接口,然后有多個實現類,每種實現類封裝了一種行為。然后根據條件的不同選擇不同的實現類。

實現過程

消息對象,當然真實的對象沒有這么簡單,省略了很多屬性。

@Data
@AllArgsConstructor
public class MessageInfo {

// 消息類型
private MsgTypeEnum type;
// 消息內容
private String content;

}

消息類型是一個枚舉類。

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

有2個消息處理接口,分別處理不同的消息。

處理文本消息

@Service
@MsgTypeHandler(value = MsgTypeEnum.TEXT)
public class TextMessageStrategy implements MessageStrategy {

@Override
public void handleMessage(MessageInfo messageInfo) {
System.out.println("處理文本消息 " + messageInfo.getContent());
}
}

處理圖片消息;

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

至此,所有代碼就已經寫完了,來跑一下測試代碼;

@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中獲取到對應的策略類,然后處理消息。

責任編輯:武曉燕 來源: Java識堂
相關推薦

2024-02-05 12:08:07

線程方式管理

2023-02-13 08:10:40

Gateway網關Spring

2023-04-28 12:37:59

Spring@Bean使用方式

2023-04-23 09:50:50

@BeanSpring

2024-11-26 00:45:29

free區域字段

2023-12-12 08:41:01

2024-11-26 14:29:48

2019-02-12 11:15:15

Spring設計模式Java

2024-05-20 10:37:08

Rust模式通信

2024-06-12 08:05:06

2023-02-27 07:56:55

IngressKubernetes

2024-09-18 07:00:00

消息隊列中間件消息隊列

2022-09-29 15:32:58

云計算計算模式

2021-10-14 06:52:47

算法校驗碼結構

2024-05-28 09:12:10

2024-04-07 00:00:00

ESlint命令變量

2019-12-12 09:23:29

Hello World操作系統函數庫

2022-03-10 08:25:27

JavaScrip變量作用域

2024-07-03 08:33:08

2019-12-02 10:16:46

架構設計模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲第一福利视频 | 国产欧美日韩精品一区 | 国产精品久久久久一区二区三区 | 欧美精品免费观看二区 | 一二三四在线视频观看社区 | 久久大陆| 91九色在线观看 | 国产精品一区二 | 日日射夜夜骑 | 欧美激情国产日韩精品一区18 | 亚洲看片网站 | 国产精品区一区二区三 | 亚洲国产成人精品久久久国产成人一区 | 国产精品中文字幕在线 | 亚洲国产精品99久久久久久久久 | 亚洲一区二区成人 | 精品久久久久久亚洲综合网站 | 亚洲国产日韩一区 | 毛片免费看 | 精品视频在线观看 | 国产一区二区三区在线 | 国产成人久久精品一区二区三区 | 久久久久久久久久久福利观看 | 日韩一级黄色毛片 | 精品国产欧美一区二区三区不卡 | 久久久精品日本 | 欧美日日 | 在线国产小视频 | 性做久久久久久免费观看欧美 | 中文字幕在线观看第一页 | 精品久久久久久久久亚洲 | 久久九精品 | 成人欧美一区二区三区黑人孕妇 | 日韩中字幕 | 亚洲一区日韩 | www视频在线观看 | 久久新| 韩日在线观看视频 | 精品一区二区观看 | 久久精品99国产精品 | 日本福利在线观看 |