觀察者設計模式


在網上找了很久沒看見有講的很清楚的,我自己花了一點時間終於弄懂了,現在想用最通俗易懂的方法將觀察者設計模式講明白

觀察者設計模式類似於發布訂閱模式,所以我准備以訂閱用戶定義公眾號來舉例說明

首先創建公眾號接口類

 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM