在網上找了很久沒看見有講的很清楚的,我自己花了一點時間終於弄懂了,現在想用最通俗易懂的方法將觀察者設計模式講明白 觀察者設計模式類似於發佈訂閱模式,所以我準備以訂閱用戶定義公眾號來舉例說明 首先創建公眾號介面類 其次創建訂閱介面類 接下來創建公眾號類 接下來創建用戶類 接下來創建主方法進行測試 以下 ...
在網上找了很久沒看見有講的很清楚的,我自己花了一點時間終於弄懂了,現在想用最通俗易懂的方法將觀察者設計模式講明白
觀察者設計模式類似於發佈訂閱模式,所以我準備以訂閱用戶定義公眾號來舉例說明
首先創建公眾號介面類
1 package 觀察者模式; 2 //公眾號介面 3 interface WechatInterface { 4 //添加用戶 5 void addUser(User user); 6 //刪除用戶(這裡相當於將用戶放入黑名單) 7 void deleteUser(User user); 8 //當公眾號要推送新的內容時,調用這個方法 9 void notifyUser(); 10 }
其次創建訂閱介面類
1 package 觀察者模式; 2 //訂閱介面 3 interface Oder { 4 //當公眾號更新內容的時候,會將內容傳入該方法,每個微信公眾號的訂閱者都要實現該方法 5 public void update(String message); 6 }
接下來創建公眾號類
1 package 觀察者模式; 2 import java.util.ArrayList; 3 import java.util.List; 4 5 //公眾號類 6 public class WechatOfficialAccount implements WechatInterface{ 7 8 //微信公眾號維護內部維護了很多訂閱用戶 9 private List<User> userList = new ArrayList<>(); 10 11 //公眾號的名字 12 private String wechatName; 13 14 //要推送的內容 15 private String message; 16 17 public WechatOfficialAccount(String wechatName) { 18 this.wechatName = wechatName; 19 } 20 21 public void setMessage(String message) { 22 this.message = message; 23 this.notifyUser(); 24 } 25 26 @Override 27 public void addUser(User user) { 28 userList.add(user); 29 } 30 31 @Override 32 public void deleteUser(User user) { 33 if (userList.indexOf(user)>=0){ 34 userList.remove(user); 35 } 36 } 37 38 @Override 39 public void notifyUser() { 40 message=this.wechatName+this.message; 41 for (User user:userList) { 42 user.update(message); 43 } 44 } 45 }
接下來創建用戶類
1 package 觀察者模式; 2 //公眾號的訂閱用戶 3 public class User implements Oder{ 4 5 //用戶關註的公眾號 6 private WechatOfficialAccount wechatOfficialAccount; 7 8 //用戶名 9 private String username; 10 11 public User(WechatOfficialAccount wechatOfficialAccount, String username) { 12 this.wechatOfficialAccount = wechatOfficialAccount; 13 this.username = username; 14 wechatOfficialAccount.addUser(this);//每創建一個用戶,都叫他關註這個公眾號 15 } 16 17 @Override 18 public void update(String message) { 19 System.out.println(username+"收到消息"+message); 20 } 21 }
接下來創建主方法進行測試
1 package 觀察者模式; 2 //測試觀察者模式的主類 3 public class Main { 4 public static void main(String[] args) { 5 WechatOfficialAccount wechatOfficialAccount = new WechatOfficialAccount("羅輯思維"); 6 User user1 = new User(wechatOfficialAccount,"馬芸"); 7 User user2 = new User(wechatOfficialAccount,"馬化疼"); 8 User user3 = new User(wechatOfficialAccount,"李艷紅"); 9 10 wechatOfficialAccount.setMessage("今日推送的內容為:時間的朋友"); 11 12 wechatOfficialAccount.deleteUser(user2);//馬化疼因為懟羅輯思維,被羅輯思維放黑名單了 13 14 wechatOfficialAccount.setMessage("今日推送的內容為:終身學習"); 15 16 } 17 }
以下是輸出結果
1 馬芸收到消息羅輯思維今日推送的內容為:時間的朋友 2 馬化疼收到消息羅輯思維今日推送的內容為:時間的朋友 3 李艷紅收到消息羅輯思維今日推送的內容為:時間的朋友 4 馬芸收到消息羅輯思維今日推送的內容為:終身學習 5 李艷紅收到消息羅輯思維今日推送的內容為:終身學習 6 7 Process finished with exit code 0