观察者模式
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
打个比方,微信公众号推出了一篇文章,关注此公众号的用户都会收到推送,下面看具体实现
在实现之前呢,首先要清楚观察者模式有几个角色:
- 主题抽象:被观察者的顶层抽象、标准,可以是接口或者抽象类,将所有的观察者对象保存在集合属性中,可以对观察者进行新增和删除,同时可以通知所有观察者,见下图
MySubject
- 主题实现类:对主题抽象的具体实现
- 观察者抽象:观察者的顶层抽象,可以是接口或者抽象类,提供状态更新方法,与主题类进行同步
- 观察者实现类:对观察者抽象的具体实现
- UML类图
-
主题抽象
MySubject
public interface MySubject { //添加观察者 void addObserver(MyObserver userObserver); //删除观察者 void removeObserver(MyObserver userObserver); //去通知观察者 void notifyUser(); }
-
微信公众号
WechatSubject
(主题实现类)public class WechatSubject implements MySubject { private List<MyObserver> list = new ArrayList<MyObserver>(); private String message; @Override public void addObserver(MyObserver userObserver) { list.add(userObserver); } @Override public void removeObserver(MyObserver userObserver) { list.remove(userObserver); } @Override public void notifyUser() { for(MyObserver observer : list){ observer.update(message); } } public void updateArtical(String message){ this.message = message; System.out.println("微信公众号发布了消息:"+message); System.out.println("=============================="); this.notifyUser(); } }
-
观察者抽象
MyObserver
public interface MyObserver { void update(String message); }
-
观察者实现类
User1
public class User1 implements MyObserver{ @Override public void update(String message) { System.out.println("User1接受到了此消息:"+message); } }
-
观察者实现类
User2
public class User2 implements MyObserver{ @Override public void update(String message) { System.out.println("User2接受到了此消息:"+message); } }
-
测试类
public class ObserverTest { public static void main(String[] args) { //初始化微信公众号 WechatSubject subject = new WechatSubject(); //创建观察者实现类 MyObserver user1 = new User1(); MyObserver user2 = new User2(); //将观察者注册到公众号中 subject.addObserver(user1); subject.addObserver(user2); //公众号更新文章 subject.updateArtical("阿里年薪两百万P8大佬网上征婚引起热议~~~~~"); subject.removeObserver(user1); System.out.println("======================"); subject.updateArtical("滴滴某技术部门裁员30%~~~~~"); } }
-
输出
微信公众号发布了消息:阿里年薪两百万P8大佬网上征婚引起热议~~~~~ ============================== User1接受到了此消息:阿里年薪两百万P8大佬网上征婚引起热议~~~~~ User2接受到了此消息:阿里年薪两百万P8大佬网上征婚引起热议~~~~~ ====================== 微信公众号发布了消息:滴滴某技术部门裁员30%~~~~~ ============================== User2接受到了此消息:滴滴某技术部门裁员30%~~~~~