定义:当对象间存在一对多关系时,则使用观察者模式。
比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
使用场景:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知
下面是一个代码示例,小孩醒来哭(被观察者)小狗、爸爸、妈妈(观察者)看到后采取对应的行为
1、观察者类和源事件类、源事件
//观察者接口
interface Observer {
void actionOnWakeUp(wakeUpEvent event);
}
//事件
abstract class Event<T> {
abstract T getSource();
}
//源事件类
class wakeUpEvent extends Event<Child>{
long timestamp;
String loc;
Child source;
public wakeUpEvent(long timestamp, String loc, Child source) {
this.timestamp = timestamp;
this.loc = loc;
this.source = source;
}
@Override
Child getSource() {
return source;
}
}
2、观察者1
class Dad implements Observer {
public void feed(wakeUpEvent event) {
System.out.println("dad feeding..."+event.locl);
}
@Override
public void actionOnWakeUp(wakeUpEvent event) {
feed(event);
}
}
3、观察者2
class Mum implements Observer {
public void hug() {
System.out.println("mum hugging...");
}
@Override
public void actionOnWakeUp(wakeUpEvent event) {
hug();
}
}
4、被观察者
class Child {
private boolean cry = false;
private List<Observer> observers = new ArrayList<>();
{
observers.add(new Dad());
observers.add(new Mum());
}
public boolean isCry() {
return cry;
}
public void wakeUp() {
cry = true;
wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "road", this);
for(Observer o : observers) {
o.actionOnWakeUp(event);
}
}
}
总结:
优点:1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制
缺点:
1、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
2、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化