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

设计模式之观察者模式

2017-06-28 22:26 148 查看
时隔多日,终于想动手写了,内心一片狼藉、愧疚。废话就不多说了,直接上正题吧。

观察者模式

观察者模式(Observer)完美的将观察者(Observer)和被观察的对象(Observerable)分离开。有个例子很恰当,报社与订报人,只要订报人预定了报纸,一有新报纸,报社就会送达给订阅人。观察者模式思想也是如此,下面具体来说:

最基本的观察者模式包括两个接口(IObserverable和IObserver)及其对应的实现类(ObserverableImp和ObserverImp),IObserverable中定义了
void registObserver(IObserver o);
,
void removeObserver(IObserver o);
,
void notifyObservers();
这三个方法;IObserver中定义了了
void update();
这个方法,实现类只需实现相应的接口的方法即可。

下面开始翠花的爱情故事:

翠花是我们的被追求者(被观察者),张三、李四、王麻子是翠花的追求者(观察者),翠花知道他们三个暗恋者自己,所以一有什么事情,就通知他们三个,三个人的表现不尽相同,因此,翠花评判张三不够喜欢自己,于是就把张三移除了自己的追求者集合当中,当翠花再次考验他们的时候,当然就不会再通知张三了。

这样就实现了一个简单的观察者模式。具体代码如下:

IObserverable 接口:

public interface IObserverable {
void registObserver(IObserver o);
void removeObserver(IObserver o);
void notifyObservers();
}


IObserver 接口:

public interface IObserver {
void update();
}


IObserverable的实现类(被观察者):

public class ObserverableImp implements IObserverable{

//男朋友集合
private Set<IObserver> set;

public ObserverableImp() {
set = new HashSet<>();
}

/**
* 注册观察者
* 相当于翠花说,我知道了,o喜欢我
*/
@Override
public void registObserver(IObserver o) {
set.add(o);
}

/**
* 取消观察者
* 相当于翠花对o死心了
*/
@Override
public void removeObserver(IObserver o) {
set.remove(o);
}

/**
* 通知观察者
* 相当于翠花考验一波追求自己的人了
*/
@Override
public void notifyObservers() {

for(IObserver o:set){
o.update();
}
}

}


IObserver 的实现类(观察者):

public class ObserverImp implements IObserver {

private String message;

public ObserverImp(String message) {
this.message = message;
}

@Override
public void update() {
System.out.println(message);
}

public void setMessage(String message) {
this.message = message;
}

}


测试类:

public class Test {

public static void main(String[] args) {
//翠花
ObserverableImp flower = new ObserverableImp();
//张三、李四、王麻子
ObserverImp zhangsan = new ObserverImp("我是张三,我好像有点喜欢翠花");
ObserverImp lisi = new ObserverImp("我是李四,我只喜欢翠花");
ObserverImp wangmazi = new ObserverImp("我是王麻子,翠花是我最心爱的人");

//张三、李四、王麻子分别向翠花说:我喜欢你
flower.registObserver(zhangsan);
flower.registObserver(lisi);
flower.registObserver(wangmazi);

//翠花开始考验追求者了
flower.notifyObservers();

//翠花觉得李四说的话显得不够爱自己,干脆放弃张三了
flower.removeObserver(zhangsan);
System.out.println("-------可爱的分割线---------");
//翠花再次考验追求者
flower.notifyObservers();

}

}


输出结果:

我是王麻子,翠花是我最心爱的人
我是张三,我好像有点喜欢翠花
我是李四,我只喜欢翠花
-------可爱的分割线---------
我是王麻子,翠花是我最心爱的人
我是李四,我只喜欢翠花
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息