您的位置:首页 > 其它

设计模式—观察者模式

2015-11-12 16:46 260 查看
观察者模式,又被称为发布-订阅模式、模型试图模式、源-收听者模式或者从属者模式。当然,怎么称呼这不重要。重要的是我们需要理解他的含义。
其主要作用就是,通过建立一个目标物体来管理所有依赖于它的观察者物件,并且在目标物件改变时,所有的观察者都能接收到通知。
在java中也就是,定义一个对象之间的一对多的依赖,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。

借用鸿洋大神的例子,他举得是微信订阅号的例子,相当清楚地讲述了观察者模式的原理,我在这里只是归纳整理,进请见谅。奉上鸿洋大神传送门一个:/article/1380412.html

总体来说:

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。

这个在鸿洋大神的例子里有,具体使用方法和上面讲述的大致一样,只是不需要我们自己再去写接口了而已。在此就不重复介绍了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: