观察者设计模式

在网上找了很久没看见有讲的很清楚的,我自己花了一点时间终于弄懂了,现在想用最通俗易懂的方法将观察者设计模式讲明白

观察者设计模式类似于发布订阅模式,所以我准备以订阅用户定义公众号来举例说明

首先创建公众号接口类

 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
原文地址:https://www.cnblogs.com/parkour1026/p/10795983.html