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是世界上最好用的语言");
}}
文章图片
这个模式是松偶合的。改变主题或观察者中的一方,另一方不会受到影像。
JDK中也有自带的观察者模式。但是被观察者是一个类而不是接口,限制了它的复用能力。
在JavaBean和Swing中也可以看到观察者模式的影子。
同时在Spring的事务机制方面:
基本上牵涉到事件(Event)方面的设计,就离不开观察者模式。不明白观察者模式的朋友,最好上网了解下。因为,这种模式在java开发中是比较常用的,又是比较重要的。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用
- Java基础-高级特性-枚举实现状态机