观察者模式,又被称为发布-订阅模式、模型试图模式、源-收听者模式或者从属者模式。当然,怎么称呼这不重要。重要的是我们需要理解他的含义。
其主要作用就是,通过建立一个目标物体来管理所有依赖于它的观察者物件,并且在目标物件改变时,所有的观察者都能接收到通知。
在java中也就是,定义一个对象之间的一对多的依赖,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
接下来,就是创建主题和观察者来实现着两个类了:
观察者实现类:
这样 我们的观察者模式基本就实现了,剩下就是调用了。这里只是介绍观察者模式的基本实现原理,但是在java开发中,我们可以调用系统中自带的观察者模式。 借助于java.util.Observable和java.util.Observer。
这个在鸿洋大神的例子里有,具体使用方法和上面讲述的大致一样,只是不需要我们自己再去写接口了而已。在此就不重复介绍了。
借用鸿洋大神的例子,他举得是微信订阅号的例子,相当清楚地讲述了观察者模式的原理,我在这里只是归纳整理,进请见谅。奉上鸿洋大神传送门一个:http://blog.csdn.net/lmj623565791/article/details/24179699
总体来说:
1.需要有一个主题(类似于订阅号),供观察者注册(类似于用户关注)
2.观察者(用户)如果想接收到主题(订阅号)的信息,就需要注册(关注)
3.当不需要接收信息时,则取消注册
4.观察者影响不了主题的行为
下面,来通过例子了解一下观察者模式的使用方法。
首先我们需要创建一个主题接口(订阅号需要实现该接口),和一个观察者接口(所有的用户都需要实现该接口)
创建主题接口:
/**
* 主题接口,创建主题时必须实现该接口
* Created by 2 on 2015/11/13.
*/
public interface SubjectImp {
/**
* 注册一个观察着
*
* @param observer
*/
void registerObserver(ObserverImp observer);
/**
* 移除一个观察者
*
* @param observer
*/
void removeObserver(ObserverImp observer);
/**
* 通知所有的观察着
*/
void notifyObservers();
}
/**
* 观察者接口,所有的观察者必须实现该接口
* Created by 2 on 2015/11/12.
*/
public interface ObserverImp
{
//在此处我们就让他实行信息更新的方法
void upDate(String string);
}
接下来,就是创建主题和观察者来实现着两个类了:
主题实现类:
/**
* 发布信息的主题实现类
* Created by 2 on 2015/11/13.
*/
public class SubjectMsg implements SubjectImp{
//创建一个集合来存放注册过的观察者
private List<ObserverImp> observers = new ArrayList<ObserverImp>();
private String msg; //消息信息
@Override
public void registerObserver(ObserverImp observer) {
observers.add(observer);
}
@Override
public void removeObserver(ObserverImp observer) {
int index = observers.indexOf(observer);
if (index >= 0) //防止空指针
{
observers.remove(index);
}
}
@Override
public void notifyObservers() {
for (ObserverImp observer : observers)
{
observer.upDate(msg);
}
}
/**
* 通过此方法,设置主题要更新的消息
*
* @param msg
*/
public void setMsg(String msg)
{
this.msg = msg;
notifyObservers();
}
}
观察者实现类:
/**
* 观察者1号
* Created by 2 on 2015/11/13.
*/
public class Observer1 implements ObserverImp{
private SubjectImp subject;
/**
* 在构造方法中传入主题来注册该观察者
* @param subject
*/
public Observer1(SubjectImp subject)
{
this.subject = subject;
subject.registerObserver(this);
}
@Override
public void upDate(String string) {
System.out.println("我是观察着1号,我收到的信息是" + string );
}
}
/**
* 观察者2号
* Created by 2 on 2015/11/13.
*/
public class Observer2 implements ObserverImp{
private SubjectImp subject;
/**
* 在构造方法中传入主题来注册该观察者
* @param subject
*/
public Observer2(SubjectImp subject)
{
this.subject = subject;
subject.registerObserver(this);
}
@Override
public void upDate(String string) {
System.out.println("我是观察着2号,我收到的信息是" + string );
}
}
这样 我们的观察者模式基本就实现了,剩下就是调用了。这里只是介绍观察者模式的基本实现原理,但是在java开发中,我们可以调用系统中自带的观察者模式。 借助于java.util.Observable和java.util.Observer。
这个在鸿洋大神的例子里有,具体使用方法和上面讲述的大致一样,只是不需要我们自己再去写接口了而已。在此就不重复介绍了。