观察者模式 JAVA设计模式之观察者模式
设计模式文章中介者模式代理模式抽象工厂模式详解 —— head first 设计模式装饰者模式适配器模式策略模式观察者模式建造者模式 (Builder)定义当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 解释:简单来说对象 A 需要关注对象 B 的状态,根据对象 B 的不同状态来做一些调整。比如播放器的 UI 变化,会依赖当前的播放状态,一旦播放状态改变了,就需要调整 UI 的显示。 使用场景
?具体实践根据上面说的,下面我们来实现一个简单的观察者模式。 ?观察者先定义一个观察者接口,具体的观察者都需要实现该接口。 package com.sjq.observer; /*** * 抽象观察者 * 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。*/ public interface Observer { void update(String message); } 接着,就是一个具体的观察者,在 update 中添加数据改变后的操作逻辑。 * 观察者 * 实现了update方法 class User implements Observer { private String name; String message; public User(String name) { this.name = name; } @Override update(String message) { this.message = message; read(); } read() { System.out.println(name + " 收到推送消息: " + message); } } ?被观察者同样的,需要定义一个被观察者接口,所有具体的被观察者对象都需要实现该接口。 * * 抽象被观察者接口 * 声明了添加、删除、通知观察者方法 Observerable { registerObserver(Observer o); removeObserver(Observer o); notifyObserver(); } ?定义具体的被观察者对象,实现了 Observerable 接口,对 Observerable 接口的三个方法进行了具体实现,同时有一个 List 集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合即可。 import java.util.ArrayList; java.util.List; * 被观察者,也就是微信公众号服务 * 实现了Observerable接口,对Observerable接口的三个方法进行了具体实现 class WechatServer //注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程 private List<Observer> list; WechatServer() { list = new ArrayList<Observer>(); } @Override registerObserver(Observer o) { list.add(o); } @Override removeObserver(Observer o) { if(!list.isEmpty()) list.remove(o); } 遍历 @Override notifyObserver() { for(int i = 0; i < list.size(); i++) { Observer oserver = list.get(i); oserver.update(message); } } setInfomation(String s) { s; System.out.println("微信服务更新消息: " + s); 消息更新,通知所有观察者 notifyObserver(); } }? 代码测试完成上面的工作之后,咱们就可以测试咱们写的代码了,看看能不能跑起来。具体如下: class Test { static 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是世界上最好用的语言!"); } }? 注意事项:?
Android 中的应用
参考文献1、http://www.runoob.com/design-pattern/observer-pattern.html 2、JAVA设计模式之观察者模式 ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |