JAVA设计模式之观察者模式
虽然自己还是个菜鸟,很多设计模式还用不上。但本着设计模式强调的是思想而不是代码的想法就单纯去学了,而且已经做好了看第二遍的准备....所以推荐大家都可以看一下。我的参考用书是程杰出版的<大话设计模式>,但是因为采用的语言是c#(没学过)所以我的学习方法是先看书在到网上看文档。
概念理解
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新。(比如微信公众号和用户)
1。以下分两种方式说明
其实两种方式差别不大,理解了一种另一种就可以看懂了(重要的是理解而不是代码)
1.Java自带观察者模式
所需包名为:
import java.util.Observable;
import java.util.Observer;
1.1被观察类:
1.2观察者类(创建a和b)
1.3最后创建测试类
运行结果:
2.手动创建观察者模式
1.定义一个被观察类接口(相当于上面的Obvsersable接口)
/***
* 抽象被观察者接口
* 声明了添加、删除、通知观察者方法
* @author jstao
*
*/
public interface Observerable {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
2.定义一个观察者接口(相当于Observer类)
/***
* 抽象观察者
* 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。
* @author jstao
*
*/
public interface Observer {
public void update(String message);
}
3.定义被观察者,实现了Observerable接口,对Observerable接口的三个方法进行了具体实现,同时有一个List集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合即可。
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>();
}
@Override
public void registerObserver(Observer o) {
list.add(o);
}
@Override
public void removeObserver(Observer o) {
if(!list.isEmpty())
list.remove(o);
}
//遍历
@Override
public 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
/**
* 观察者
* 实现了update方法
* @author jstao
*
*/
public class User implements Observer {
private String name;
private String message;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
read();
}
public void read() {
System.out.println(name + " 收到推送消息: " + message);
}
}
5、编写一个测试类
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是世界上最好用的语言!");
}
}
运行结果:
总结
其实这两个类都是相似的实现原理,其实启用ctrl+鼠标左键单击Observable接口即可查看其原理。实现的步骤都是一样的。
代码太长我比较懒就不手写代码了,如果错误鉴于水平不够请见谅。
参考文章
Java自带实现观察者模式
https://www.cnblogs.com/gongjian/p/6104766.html
手写原理: