观察者设计模式
在网上找了很久没看见有讲的很清楚的,我自己花了一点时间终于弄懂了,现在想用最通俗易懂的方法将观察者设计模式讲明白
观察者设计模式类似于发布订阅模式,所以我准备以订阅用户定义公众号来举例说明
首先创建公众号接口类
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
The only way to do great work is to love what you do.