观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
- 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
- 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
- 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
- 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。
java实现:
抽象被观察者(抽象主题):Observable.java
抽象被观察者的具体实现(主题服务):ObservableImpl.java
抽象观察者(用户(订阅者)的抽象):Observer.java
抽象观察者的具体实现(用户(订阅者)具体实现):User.java
Observable.java(被订阅服务的实现)
/** * @ClassName Observerable 被观察者(被订阅的对象抽象) * @Description TODO * @author jxd * @Date 2018年9月11日 上午10:15:33 * @version 1.0.0 */ public interface Observable { //注册用户 public void registerUser(Observer observer); //移除用户 public void removeUser(Observer observer); //通知观察者 public void notifyObserver();
}
|
ObservableImpl.java(被订阅服务的实现)
/** * @ClassName ObservableImpl 抽象被观察者(主题服务)的具体实现 * @Description TODO * @author jxd * @Date 2018年9月11日 下午1:58:42 * @version 1.0.0 */ public class ObservableImpl implements Observable {
private List<Observer> userList = new ArrayList<>();;
private String message;
@Override public void registerUser(Observer observer) { // TODO Auto-generated method stub userList.add(observer); }
@Override public void removeUser(Observer observer) { // TODO Auto-generated method stub if (observer != null && userList != null && userList.size() > 0) { userList.remove(observer); } }
@Override public void notifyObserver() { // TODO Auto-generated method stub userList.forEach(x -> { x.getTopicNotification(message); }); }
public void setInformation(String str){ this.message=str; notifyObserver(); }
}
|
Observer.java(订阅者的抽象)
/** * @ClassName Observer 抽象观察者(需要订阅主题的用户) * @Description TODO * @author jxd * @Date 2018年9月11日 上午10:16:49 * @version 1.0.0 */ public interface Observer {
/** * @Description (得到主题(订阅对象)返回的通知) * @param message */ public void getTopicNotification(String message); }
|
User.java(订阅对象的实现)
public class User implements Observer {
private String name; private String message;
public User(String name) { this.name = name; }
@Override public void getTopicNotification(String message) { // TODO Auto-generated method stub this.message = message; read();
}
public void read() { System.out.println(name + ":" + "收到消息内为:" + message); }
}
|
测试。。。。。。。。。。
public static void main(String[] args) { Observer z=new User("jinxudong"); Observer s = new User("jinxudong1"); Observer e = new User("jinxudong2"); ObservableImpl wechatServer=new ObservableImpl(); wechatServer.registerUser(s); wechatServer.registerUser(z); wechatServer.registerUser(e); wechatServer.setInformation("发布第一次消息..."); System.out.println("-------------------测试取消关注 -------"); wechatServer.removeUser(z); wechatServer.setInformation("发布第二次消息...");
}
测试结果:
jinxudong1:收到消息内为:发布第一次消息... jinxudong:收到消息内为:发布第一次消息... jinxudong2:收到消息内为:发布第一次消息... -------------------测试取消关注 ------- jinxudong1:收到消息内为:发布第二次消息... jinxudong2:收到消息内为:发布第二次消息...
|