欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

观察者设计模式

程序员文章站 2022-04-14 18:41:40
在网上找了很久没看见有讲的很清楚的,我自己花了一点时间终于弄懂了,现在想用最通俗易懂的方法将观察者设计模式讲明白 观察者设计模式类似于发布订阅模式,所以我准备以订阅用户定义公众号来举例说明 首先创建公众号接口类 其次创建订阅接口类 接下来创建公众号类 接下来创建用户类 接下来创建主方法进行测试 以下 ......

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

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

首先创建公众号接口类

 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