观察者模式是一种行为设计模式,应用比较广泛。他跟钩子函数、回调函数其实是一回事。
观察者的调用类图:
上面这种方式,没有抽象出单独的事件。还有一种方式,可以将事件单独抽象出来,观察者接收到事件之后,根据事件作出响应
示例代码:小孩哭的时候,爸爸哄哄,妈妈喂喂
public class Main {
public static void main(String[] args) {
//创建观察者的管理者类,并添加观察者
ObserverManager obm = new ObserverManager();
obm.add(new Dad()).add(new Mom());
Child child1 = new Child("Tom", obm);
child1.cry();
Child child2 = new Child("Jack", obm);
child2.cry();
}
}
/**
* 被观察者基类
*/
class Observed {
public String name;
public ObserverManager observerManager;
}
/**
* 具体被观察者
*/
class Child extends Observed {
public Child (String name, ObserverManager observerManager){
this.name = name;
this.observerManager = observerManager;
}
public void cry(){
ActionEvent ae = new ActionEvent(this);
observerManager.notify(ae);
}
}
/**
* 事件类
*/
class ActionEvent {
private Observed observed;
public ActionEvent(Observed observed){
this.observed = observed;
}
public Observed getSource() {
return observed;
}
}
/**
* 观察者的管理员类
*/
class ObserverManager{
List<Observer> observers = new ArrayList<>();
public ObserverManager add(Observer ob){
observers.add(ob);
return this;
}
public void notify(ActionEvent actionEvent){
for(int i=0;i<observers.size();i++){
observers.get(i).doAction(actionEvent);
}
}
}
/**
* 通用观察者接口
*/
interface Observer {
void doAction(ActionEvent actionEvent);
}
/**
* 具体观察者dad
*/
class Dad implements Observer{
@Override
public void doAction(ActionEvent actionEvent) {
System.out.println(actionEvent.getSource().name+"爸爸哄哄");
}
}
/**
* 具体观察者mom
*/
class Mom implements Observer{
@Override
public void doAction(ActionEvent actionEvent) {
System.out.println(actionEvent.getSource().name+"妈妈喂喂");
}
}