1、前言 作為嵌入式軟體開發,可能經常會使用命令行或者顯示屏等設備實現人機交互的功能,功能中通常情況都包含 UI 菜單設計;很多開發人員都會有自己的菜單框架模塊,防止重覆造輪子,網上有很多這種菜單框架的代碼,但是大多耦合性太強,無法獨立出來適配不同的菜單設計。 本文介紹一個降低了耦合性,完全獨立的菜 ...
轉自:
http://www.java265.com/JavaCourse/202206/3741.html
下文筆者講述觀察者模式的簡介說明,如下所示
觀察者模式
觀察者模式: 稱為發佈/訂閱(Publish/Subscribe)模式 用於定義一個一對多的依賴關係, 當一個對象狀態發生變化時,依賴它的對象都會收到通知 觀察者模式優點: 1.觀察者和被觀察者是抽象耦合的 2.建立一套觸發機制 觀察者模式缺點: 1.當一個被觀察者對象有很多的直接和間接的觀察者的話 將所有的觀察者都通知到會花費很多時間。 2.當觀察者和觀察目標之間有迴圈依賴的話,觀察目標會觸發它們之間進行迴圈調用,可能導致系統崩潰 3.觀察者模式沒有相應的機制讓觀察者知道所觀察的目標對象是怎麼發生變化的,而僅僅只是知道觀察目標發生了變化。 如: 公眾號發佈消息,關註它的微信都可以收到更新通知 這就是一種典型的觀察者模式的實現 那麼如何實現觀察者模式呢?下文將一一道來,如下所示:
例:
觀察者模式的示例代碼
//抽象被觀察者介面 public interface Observerable { //訂閱 void registerObserver(Observer o); //取消訂閱 void removeObserver(Observer o); //更新 void notifyObserver(); } 2 抽象觀察者介面 //抽象觀察者介面 public interface Observer { //接受變動通知 public void update(String message); } 3觀察者實現介面 // 觀察者 public class User implements Observer { private String name; private String message; public User(String name) { // TODO Auto-generated constructor stub this.name = name; } @Override public void update(String message) { // TODO Auto-generated method stub this.message = message; read(); } private void read() { // TODO Auto-generated method stub System.out.println(name + " 收到推送消息: " + message); } } 4 被觀察者實現介面 import java.util.ArrayList; import java.util.List; // 被觀察者, 微信公眾號 public class WechatServer implements Observerable { //註意到這個List集合的泛型參數為Observer介面,設計原則:面向介面編程而不是面向實現編程 private List<Observer> list; private String message; public WechatServer() { list = new ArrayList<Observer>(); } @Override public void registerObserver(Observer o){ list.add(o); } @Override public void removeObserver(Observer o) { if(!list.isEmpty()) list.remove(o); } //遍歷 @Override public void notifyObserver(){ for(int i = 0; i < list.size(); i++) { Observer oserver = list.get(i); oserver.update(message); } } public void setInfomation(String s) { this.message = s; System.out.println("微信服務更新消息: " + s); //消息更新,通知所有觀察者 notifyObserver(); } } 測試 public class Main{ public static void main(String[] args) { //創建微信伺服器對象 WechatServer server = new WechatServer(); //創建多個用戶對象 User a = new User("maomao"); User b = new User("java265"); User c = new User("hahaha"); //訂閱者用戶接受消息 server.registerObserver(a); server.registerObserver(b); server.registerObserver(c); //微信伺服器發送消息 server.setInfomation("我要發送一個消息"); System.out.println("------------華麗的分割線---------------"); / /c把訂閱號給取消了 server.removeObserver(c); //微信伺服器修改消息 server.setInfomation("發送消息二"); } }