Java设计模式之观察者模式
2017-12-27 22:09
337 查看
观察者模式定义了对象间的一种一对多的组合关系,即一个被观察者可以对应多个观察者,当被观察者状态发生变化的时候,所有依赖于它的观察者都将收到通知并自动更新
实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——取消注册”的形式,如EventBus,RxJava都是使用观察者模式实现的
名词解析
Subject、Observable:被观察者
Subscriber、Observer:观察者
代码示例
定义被观察者接口和被观察者实现类
定义观察者接口和观察者实现类
执行类
在观察者模式中,又分为推模型和拉模型两种方式。上面的例子就是典型的推模型,即向观察者推送详细信息,而拉模型是向观察者推送少量信息,更具体的信息则由观察者自己去被观察者对象中去取,一般会把被观察者推送给观察者。
以上就是观察者模式的简单使用,当然真实使用中还需要考虑多线程同步等问题。
实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——取消注册”的形式,如EventBus,RxJava都是使用观察者模式实现的
名词解析
Subject、Observable:被观察者
Subscriber、Observer:观察者
实现观察者模式
这里以乔布斯的苹果公司和使用iphone手机的消费者举例,苹果公司好比是被观察者,消费者是观察者,每当苹果公司需要让手机系统更新时,都会自动通知持有iphone手机的消费者代码示例
定义被观察者接口和被观察者实现类
/** * Created by yunzhao.liu on 2017/12/27 * 被观察者接口 */ public interface Subject { /** * 注册观察者 * @param o 观察者 */ void registerObserver(Observer o); /** * 取消注册观察者 * @param o 观察者 */ void unregisterObserver(Observer o); /** * 通知所有观察者 */ void notifyObservers(String info); } /** * Created by yunzhao.liu on 2017/12/27 * 被观察者实现类 */ public class AppleIncSubject implements Subject { //用来存放观察者 private ArrayList<Observer> list = new ArrayList<>(); @Override public void registerObserver(Observer o) { list.add(o); } @Override public void unregisterObserver(Observer o) { list.remove(o); } @Override public void notifyObservers(String info) { for (Observer o : list) { o.update(info); } } /** * 更新版本信息 */ public void updateVertion(String info) { this.notifyObservers(info); } }
定义观察者接口和观察者实现类
/** * Created by yunzhao.liu on 2017/12/27 * 观察者接口 */ public interface Observer { /** * 每个观察者都需要实现该方法 * 当被观察者状态发生改变时,通知每个观察者去更新 * * @param info 更新信息 */ void update(String info); } /** * Created by yunzhao.liu on 2017/12/27 * 观察者实现类 */ public class ConsumerObserver implements Observer{ //消费者姓名 private String name; public ConsumerObserver(String name) { this.name = name; } @Override public void update(String info) { System.out.println(name+"已更新版本到:"+info); } }
执行类
/** * Created by yunzhao.liu on 2017/12/27 */ public class TestChange { public static void main(String[] args) { AppleIncSubject subject = new AppleIncSubject(); ConsumerObserver observer1 = new ConsumerObserver("小明"); ConsumerObserver observer2 = new ConsumerObserver("小芳"); ConsumerObserver observer3 = new ConsumerObserver("小红"); subject.registerObserver(observer1); subject.registerObserver(observer2); subject.registerObserver(observer3); subject.updateVertion("1.1.1"); } }
在观察者模式中,又分为推模型和拉模型两种方式。上面的例子就是典型的推模型,即向观察者推送详细信息,而拉模型是向观察者推送少量信息,更具体的信息则由观察者自己去被观察者对象中去取,一般会把被观察者推送给观察者。
以上就是观察者模式的简单使用,当然真实使用中还需要考虑多线程同步等问题。
相关文章推荐
- 实例解析观察者模式及其在Java设计模式开发中的运用
- java设计模式-观察者模式
- Java行为型设计模式-观察者(一)
- 浅析Java设计模式中的观察者模式
- Java设计模式之观察者模式(Observer)
- JAVA设计模式:观察者模式
- java观察者设计模式
- 设计模式(十九)----- 观察者模式(Observer)----(JAVA版)
- Java程序性能优化 读书笔记(六)设计模式:观察者模式
- Java设计模式之观察者模式
- java设计模式:观察者模式
- JAVA的23种设计模式---观察者模式
- Java设计模式-回调函数和观察者模式
- java设计模式之观察者模式
- Java设计模式(观察者模式)
- 我的Java设计模式-观察者模式
- JAVA设计模式 之 观察者模式(JDK内置实现)
- java设计模式之观察者模式
- [2014-10-28]JAVA笔记_设计模式之观察者模式(Observer)
- Java设计模式-----Observer观察者模式