设计模式之观察者模式
定义:
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
模式对象:
- 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
- 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
- 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
- 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。
/** * @author yuyang * @DATE 2019/1/7 0007-10:14 * 抽象观察者接口 */ public interface Observer { //接收信息 void receiveInformation (String msg); }
/** * @author yuyang * @DATE 2019/1/7 0007-10:13 * 抽象被观察者接口 */ public interface Observerable { //新增关注 void register(Observer observer); //取消关注 void remove(Observer observer); //订阅消息通知 void notifyMsm(); }
/** * @author yuyang * @DATE 2019/1/7 0007-10:23 * 具体观察者 */ public class User implements Observer{ String name; String msg; public User(String name) { this.name = name; } @Override public void receiveInformation(String msg) { this.msg=msg; read(); } public void read(){ System.out.println(name+"接收到的推送:"+msg); } }
/** * @author yuyang
* 具体被观察者 * @DATE 2019/1/7 0007-10:16 */ public class WechatServer implements Observerable { List<Observer> list; String msg; public WechatServer() { list = new ArrayList<>(); } @Override public void register(Observer observer) { list.add(observer); } @Override public void remove(Observer observer) { if (list != null) { list.remove(observer); } } @Override public void notifyMsm() { for (Observer ls: list) { ls.receiveInformation(msg); } } //编辑推送消息 public void setinformation(String s){ this.msg = s; System.out.println("微信服务更新消息: " + s); //消息更新,通知所有观察者 notifyMsm(); } }
/** * @author yuyang * @DATE 2019/1/7 0007-10:28 */ public class Test { public static void main(String[] args) { WechatServer observerable=new WechatServer(); User user=new User("与昂"); User user2=new User("yuang"); User user3=new User("于洋"); observerable.register(user); observerable.register(user2); observerable.register(user3); observerable.setinformation("PHP是世界上最好的语言"); System.out.println("___________________________________________"); observerable.remove(user3); observerable.setinformation("那你把Java放在那里?"); } }