共计 2055 个字符,预计需要花费 6 分钟才能阅读完成。
简介:
观察者模式:又叫公布 - 订阅模式,这外面有两个最重要的元素,一个是观察者,一个是被观察者,观察者的行为依赖于被观察者的状态,或者说当被察看对象 (事件源对象) 的状态扭转时,会影响到观察者的行为。UML 图如下:
其中,Source 类是被观察者,它把所有对观察者对象的援用文件存在了一个汇合,每个被观察者都能够有任何数量的观察者。Observer 类是形象观察者,为所有的具体观察者定义一个接口,在失去被观察者的告诉时做出相应的操作;当 Source 外部的状态产生扭转时,给所有注销过的观察者发出通知(传入一个 event, 也就是将状态变动封装为一个事件);Observer1 和 Observer2 具体观察者实现形象观察者角色所要求的行为,以便使自身的状态与被观察者的状态相协同
应用场景:
关联行为场景
事件多级触发场景
模式实例:
在这里,我应用一个毕竟简略的例子介绍一下,比方 java awt 中的事件,当窗口上的按钮被点击的时候,事件监听器打印相应的内容,在这个当中,咱们模拟一下 awt 的事件机制:
1、Button(事件源对象 / 被观察者)
首先定义一个观察者数组,并实现增、删及告诉操作。它的职责很简略,就是定义谁能察看,谁不能察看
class Button{private List<ActionListener> actionListeners = new ArrayList<>();
// 当按钮被按下,告诉观察者,传入事件对象,观察者做出相应的操作
public void buttonPressed(){ActionEvent e = new ActionEvent(System.currentTimeMillis(), this);
for(int i = 0; i< actionListeners.size(); i++) {actionListeners.get(i).actionPerformed(e);
}
}
public void addActionListerner(ActionListener listener){actionListeners.add(listener);
}
public void delActionListerner(ActionListener listener){actionListeners.remove(listener);
}
}
2、ActionListener 形象观察者
观察者个别是一个接口,每一个实现该接口的实现类都是具体观察者
interface ActionListener {public void actionPerformed(ActionEvent e);
}
3、ActionEvent 公布的事件对象
这里解释一下为什么定义一个事件对象,有时候咱们可能只是简略的告诉一下观察者,不须要传太多货色,然而大部分时候可能咱们的观察者还须要晓得更多的货色,比方事件源,如果咱们的观察者须要调用被观察者的办法,那么咱们在这个事件对象当中拿到被观察者对象,就能够间接调用它的办法了
class ActionEvent{
long when;
Object source;
public ActionEvent(long when, Object source){super();
this.when = when;
this.source = source;
}
public long getWhen() {return when;}
public Object getSource() {return source;}
}
4、具体观察者
class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {System.out.println("button pressed!");
}
}
class MyActionListener2 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {System.out.println("button pressed 2!");
}
}
5、客户端
public class Test {public static void main(String[] args) {
// 事件源对象 / 被观察者
Button button = new Button();
// 察看
button.addActionListerner(new MyActionListener());
button.addActionListerner(new MyActionListener2());
// 开始流动
button.buttonPressed();}
}
总结:观察者模式的利用比拟宽泛,在这种 ui 下面的事件机制,如 awt,javascript 的按钮点击事件等,它还能够跟责任链模式联合应用,将具体的观察者串成一条链,接管到告诉的时候在链中去执行
Observer、Listener、Hook、Callback 全都是观察者模式