日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

观察者模式Java实现

發(fā)布時間:2023/12/1 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 观察者模式Java实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

觀察者模式就是當?個?為發(fā)?時傳遞信息給另外?個?戶接收做出相應的處理,兩者之間沒有直接的耦合關聯(lián)。
觀察者模式分為三大塊:
事件監(jiān)聽、事件處理、具體業(yè)務流程

例子解析

模擬搖號:

代碼結(jié)構:

開發(fā)中會把主線流程開發(fā)完成后,再使?通知的?式處理輔助流程。他們可以是異步的,在MQ以及定時任務的處理下,保證最終?致
性。

事件監(jiān)聽接口定義:

public interface EventListener {void doEvent(LotteryResult result); }

接口定義基本的事件類

兩個監(jiān)聽事件實現(xiàn):

發(fā)送短信的事件:

public class MessageEventListener implements EventListener {private Logger logger = LoggerFactory.getLogger(MessageEventListener.class);public void doEvent(LotteryResult result) {logger.info("給{}發(fā)短信{}", result.getuId(), result.getMsg()); } }

發(fā)送MQ的事件:

public class MQEventListener implements EventListener {private Logger logger = LoggerFactory.getLogger(MQEventListener.class);public void doEvent(LotteryResult result) {logger.info("給{}發(fā)搖號結(jié)果{}", result.getuId(), result.getMsg()); } }

事件處理類

public class EventManager {Map<Enum<EventType>, List<EventListener>> listeners = new HashMap<>();public EventManager(Enum<EventType>... operations) {for (Enum<EventType> operation : operations) {this.listeners.put(operation, new ArrayList<>());}}public enum EventType {MQ,Message}/**訂閱*eventType : 事件類型*listener : 監(jiān)聽*/public void subscribe(Enum<EventType> eventType, EventListener listener) {List<EventListener> users = listeners.get(eventType);users.add(listener);}/**取消訂閱*eventType : 事件類型*listener : 監(jiān)聽*/public void unsubscribe(Enum<EventType> eventType, EventListener listener) {List<EventListener> users = listeners.get(eventType);users.remove(listener);}/**通知*eventType : 事件類型*result : 結(jié)果*/public void notify(Enum<EventType> eventType, LotteryResult result) {List<EventListener> users = listeners.get(eventType);for (EventListener listener : users) {listener.doEvent(result);}} }

實現(xiàn)了三個主要方法:訂閱、取消訂閱、通知,用于對于監(jiān)聽事件的添加與使用
事件有不同類型,使用枚舉方式進行處理,方便外部在規(guī)定下使用事件。

業(yè)務抽象類接口:

public abstract class LotteryService {public EventManager eventManager;public LotteryService() {eventManager = new EventManager(EventManager.EventType.MQ, EventManager.EventType.Message);eventManager.subscribe(EventManager.EventType.MQ, new MQEventListener());eventManager.subscribe(EventManager.EventType.Message, new MessageEventListener());}public LotteryResult draw(String uId) {LotteryResult lotteryResult = doDraw(uId);// 需要什么通知就調(diào)用哪個方法eventManager.notify(EventManager.EventType.MQ, lotteryResult);eventManager.notify(EventManager.EventType.Message, lotteryResult);return lotteryResult;}protected abstract LotteryResult doDraw(String uId); }

只有調(diào)用draw方法才能完成事件通知

業(yè)務接口實現(xiàn)類

public class LotteryServiceImpl extends LotteryService {private MinibusTargetService minibusTargetService = new MinibusTargetService();protected LotteryResult doDraw(String uId) {// 搖號String lottery = minibusTargetService.lottery(uId);// 結(jié)果return new LotteryResult(uId, lottery, new Date());} }

結(jié)論

將原有流程拆分為核心流程與輔助流程代碼。
核心流程一般不會變,輔助流程可能會變。
此設計模式結(jié)構上滿足開閉原則,需要新增其他監(jiān)聽事件或者修改監(jiān)聽邏輯,不需要改動事件處理類。

總結(jié)

以上是生活随笔為你收集整理的观察者模式Java实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。