观察者模式Java实现
生活随笔
收集整理的這篇文章主要介紹了
观察者模式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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 驻马店治疗输卵管堵塞最好的医院推荐
- 下一篇: 公钥和私钥 java_公钥与私钥 -