23种设计模式|Java设计模式--观察者模式

在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
23种设计模式|Java设计模式--观察者模式
文章图片

抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。
【23种设计模式|Java设计模式--观察者模式】代码如下:
package observer; /** * * 抽象被观察者接口 声明了添加、删除、通知观察者的方法 * * @Title Observerable.java * @Package observer * @Description: TODO * @author Young * @date 2018年5月23日 下午6:23:29 * @version V1.0 */ public interface Observerable {public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObserver(); }

抽象观察者
package observer; /** * * 抽象观察者 定义update方法,但被观察者调用notifyObservers()时。观察者的update会被回调。 * * @Title Observer.java * @Package observer * @Description: TODO * @author Young * @date 2018年5月23日 下午6:27:24 * @version V1.0 */ public interface Observer {public void update(String messgae); }

package observer; import java.util.ArrayList; import java.util.List; /** * 被观察者,也就是微信公众号服务。 * * 实现了Observerable接口,对Observverable接口的三个方法进行了具体实现 * * @Title WechatServer.java * @Package observer * @Description: TODO * @author Young * @date 2018年5月23日 下午6:30:27 * @version V1.0 */ public class WechatServer implements Observerable {// 注意到List集合泛型参数为Observer接口。体现了面向接口编程 private final List list; private String message; public WechatServer() { list = new ArrayList(); }@Override public void registerObserver(Observer o) { list.add(o); }@Override public void removeObserver(Observer o) { if (!list.isEmpty()) { list.remove(0); } }@Override public void notifyObserver() { for (int i = 0; i < list.size(); i++) { Observer observer = list.get(i); observer.update(message); } }public void setInfomation(String s) { this.message = s; System.out.println("微信服务更新消息:" + s); notifyObserver(); }}

package observer; /** * 观察者实现类 实现了update方法 * * @Title User.java * @Package observer * @Description: TODO * @author Young * @date 2018年5月23日 下午6:36:43 * @version V1.0 */ public class User implements Observer {private final String name; private String message; public User(String name) { this.name = name; }@Override public void update(String messgae) { this.message = messgae; read(); }public void read() { System.out.println(name + "收到的推送消息:" + message); }}

测试类
package observer; /** * 测试测试类 * * 首先测试了三个用户,zhangsan、lisa、wangwu。 * * 公众号发布了一条消息:"PHP是世界上最好的语言"。三个用户都收到了消息。 * * 用户lisa看到消息后颇为震惊,果断取消,公众号再次发送消息,lisa已经收不到了。 * * @Title Test.java * @Package observer * @Description: TODO * @author Young * @date 2018年5月23日 下午6:39:05 * @version V1.0 */ public class Test { public static void main(String[] args) {WechatServer server = new WechatServer(); Observer zhangsan = new User("zhangsan"); Observer lisa = new User("lisa"); Observer wangwu = new User("wangwu"); server.registerObserver(zhangsan); server.registerObserver(lisa); server.registerObserver(wangwu); server.setInfomation("PHP是世界上最好的语言!!!"); System.out.println("zhangsan震惊了!!"); server.removeObserver(zhangsan); server.setInfomation("Java是世界上最好用的语言"); }}

23种设计模式|Java设计模式--观察者模式
文章图片

这个模式是松偶合的。改变主题或观察者中的一方,另一方不会受到影像。
JDK中也有自带的观察者模式。但是被观察者是一个类而不是接口,限制了它的复用能力。
在JavaBean和Swing中也可以看到观察者模式的影子。
同时在Spring的事务机制方面:
基本上牵涉到事件(Event)方面的设计,就离不开观察者模式。不明白观察者模式的朋友,最好上网了解下。因为,这种模式在java开发中是比较常用的,又是比较重要的。

    推荐阅读