您的位置:首页 > 编程语言 > Java开发

Java设计模式之观察者模式

2017-12-27 22:09 337 查看
观察者模式定义了对象间的一种一对多的组合关系,即一个被观察者可以对应多个观察者,当被观察者状态发生变化的时候,所有依赖于它的观察者都将收到通知并自动更新

实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——取消注册”的形式,如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");
}
}


在观察者模式中,又分为推模型和拉模型两种方式。上面的例子就是典型的推模型,即向观察者推送详细信息,而拉模型是向观察者推送少量信息,更具体的信息则由观察者自己去被观察者对象中去取,一般会把被观察者推送给观察者。

以上就是观察者模式的简单使用,当然真实使用中还需要考虑多线程同步等问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息