1.何谓观察者模式?
观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。在这里,发生改变的对象称之为观察目标,而被通知的对象称之为观察者。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以么可以根据需要增加和删除观察者,使得系统更易于扩展。所以观察者提供了一种对象设计,让主题和观察者之间以松耦合的方式结合。
2.观察者模式结构图
3.观察者模式使用场景例子(微信公众号消息推送服务)
有一个微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息。
4.观察者模式实现
4.1定义一个抽象观察者接口
//抽象观察者
public Interface ObService() {
/**
*定义一个update();当被观察者调用notify()时,观察者回调update()
*/
public void update(String message);
}
4.2定义一个被抽象观察者
public interface ObServiceAble() {
/*
* 被观察者
* 声明了添加、删除、通知观察者方法
*/
public void registerService(ObService o);
public void removeService(ObService o);
public void notifyService();
}
4.3定义一个具体观察者
/**
* 具体观察者
* @author a
*
*/
public class pojo implements ObService {
private String name;
private String message;
public pojo(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
red();
}
public void red() {
System.out.println("收到推送消息:" + message);
}
}
4.4 定义被观察者
实现了Observerable接口,对Observerable接口的三个方法进行了具体实现,同时有一个List集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合即可。
public class ServiceImpl implements ObServiceAble {
private List<ObService> list;
private String message;
public ServiceImpl() {
list = new ArrayList<ObService>();
}
@Override
public void registerService(ObService o) {
list.add(o);
}
@Override
public void removeService(ObService o) {
if (list != null && !list.isEmpty()) {
list.remove(o);
}
}
@Override
public void notifyService() {
for (int i = 0; i < list.size(); i++) {
ObService obService = list.get(i);
obService.update(message);
}
}
public void setInfomesage(String ms) {
this.message = ms;
System.out.println("微信服务更新消息:" + message);
notifyService();
}
}
4.5 编写一个测试类
public class test1 {
public static void main(String[] args) {
ServiceImpl serviceImpl = new ServiceImpl();
pojo ZhangsanUser = new pojo("张三");
pojo LishiUser = new pojo("李四");
pojo WangwuUser = new pojo("王五");
serviceImpl.registerService(ZhangsanUser);
serviceImpl.registerService(LishiUser);
serviceImpl.registerService(WangwuUser);
serviceImpl.setInfomesage("hello word!");
System.out.println("---------------------");
serviceImpl.removeService(ZhangsanUser);
serviceImpl.setInfomesage("hello java!");
}
}
4.6 输出结果
微信服务更新消息:hello word!
收到推送消息:hello word!
收到推送消息:hello word!
收到推送消息:hello word!
---------------------
微信服务更新消息:hello java!
收到推送消息:hello java!
收到推送消息:hello java!