核心:
观察者模式主要用于1:N的通知,当一个对象(目标对象Subject或者Observable)的状态发生变化时,它需要及时告知一系列对象(观察者对象,Observer),令他们作出响应---通知观察者的方式推每次都会把通知以广播方式发送给所有观察者,所有观察者只能被动接收拉观察者只要直到有情况即可,至于什么时候获取内容,获取什么内容,都可以主动决定
具体代码
1、定义一个抽象被观察者接口
package com.jstao.observer;/**** 抽象被观察者接口* 声明了添加、删除、通知观察者方法* @author jstao**/public interface Observerable {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObserver();}
2、定义一个抽象观察者接口
package com.jstao.observer;/**** 抽象观察者* 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。* @author jstao**/public interface Observer {public void update(String message);}
3、定义被观察者,实现了Observerable接口,对Observerable接口的三个方法进行了具体实现,同时有一个List集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合即可。
package com.jstao.observer;import java.util.ArrayList;import java.util.List;/*** 被观察者,也就是微信公众号服务* 实现了Observerable接口,对Observerable接口的三个方法进行了具体实现* @author jstao**/public class WechatServer implements Observerable {//注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程private List<Observer> list;private String message;public WechatServer() {list = new ArrayList<Observer>();}@Overridepublic void registerObserver(Observer o) {list.add(o);}@Overridepublic void removeObserver(Observer o) {if(!list.isEmpty())list.remove(o);}//遍历@Overridepublic void notifyObserver() {for(int i = 0; i < list.size(); i++) {Observer oserver = list.get(i);oserver.update(message);}}public void setInfomation(String s) {this.message = s;System.out.println("微信服务更新消息: " + s);//消息更新,通知所有观察者notifyObserver();}}
4、定义具体观察者,微信公众号的具体观察者为用户User
package com.jstao.observer;/*** 观察者* 实现了update方法* @author jstao**/public class User implements Observer {private String name;private String message;public User(String name) {this.name = name;}@Overridepublic void update(String message) {this.message = message;read();}public void read() {System.out.println(name + " 收到推送消息: " + message);}}
5、编写一个测试类
package com.jstao.observer;public class Test {public static void main(String[] args) {WechatServer server = new WechatServer();Observer userZhang = new User("ZhangSan");Observer userLi = new User("LiSi");Observer userWang = new User("WangWu");server.registerObserver(userZhang);server.registerObserver(userLi);server.registerObserver(userWang);server.setInfomation("PHP是世界上最好用的语言!");System.out.println("----------------------------------------------");server.removeObserver(userZhang);server.setInfomation("JAVA是世界上最好用的语言!");}}
