成人免费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-12-12 08:41:01

2019-02-12 11:15:15

Spring設計模式Java

2024-05-20 10:37:08

Rust模式通信

2023-04-28 12:37:59

Spring@Bean使用方式

2023-04-23 09:50:50

@BeanSpring

2024-11-26 00:45:29

free區域字段

2019-12-12 09:23:29

Hello World操作系統函數庫

2022-03-10 08:25:27

JavaScrip變量作用域

2024-11-26 14:29:48

2023-04-26 10:21:04

2023-12-20 08:23:53

NIO組件非阻塞

2024-04-30 09:02:48

2021-02-06 21:57:40

Debug模式Release

2023-02-27 07:56:55

IngressKubernetes

2024-06-12 08:05:06

2021-10-14 06:52:47

算法校驗碼結構

2022-09-29 15:32:58

云計算計算模式

2024-09-18 07:00:00

消息隊列中間件消息隊列
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久麻豆精品 | 欧美网址在线观看 | 不卡欧美| 在线免费观看一区二区 | 一级做a爰片性色毛片视频停止 | 日本亚洲精品 | 日韩有码在线播放 | www.亚洲视频| 色网在线看 | 亚州午夜精品 | 一区二区亚洲 | 99久久视频 | 日韩高清国产一区在线 | 欧美成人一级 | 久久久久久久久精 | 99久久精品免费视频 | 人人艹人人爽 | 99久久精品国产麻豆演员表 | 精品亚洲一区二区三区四区五区 | 在线观看国产视频 | 在线观看欧美日韩视频 | 国产高清精品在线 | 日韩高清国产一区在线 | 国产精品成人一区 | 成人毛片视频免费 | 亚洲精品9999 | 九九天堂网 | 久久精品欧美电影 | 男女视频在线看 | 操久久 | 成人在线免费观看av | 欧美精品二区 | 二区三区在线观看 | 日韩区| 国产激情综合五月久久 | 97精品国产| 777毛片| 日韩在线观看中文字幕 | 欧美日韩一区二区在线 | 欧美亚洲成人网 | 亚洲 欧美 另类 综合 偷拍 |