观察者模式(监听器模式)
? ? ? 以前学习过《设计模式》,现在已经忘得差不多了,虽然知道一些模式的作用和意义,但是对他们的具体实现和应用场景不甚了解,故将工作中遇到的一些模式整理一下,加深理解。
?
观察者模式基本概念
?
? ? ? ?观察者模式(Observer),也称发布/订阅模式;
? ? ? ?观察者模式是软件设计模式的一种。在此模式中,一个目标(被观察者)管理所有相依于它的观察者,并且在它本身的状态改变时主动发出通知。这通常通过调用各观察者所提供的方法来实现。
? ? ? ?观察者模式完美的将观察者和被观察的对象分离开。
? ? ? ?面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了系统的可维护性和重用性。
?
观察者模式的实现
?
? ? ? ?观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。
? ? ? ?实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。
? ? ? ?实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——撤销注册”的形式。下面详细的描述了这样一种过程:
?
public class MyCreateAction { //引入监听器 private MyListener myListener; //引入事件,用来传给Listener进行处理 private static MyEvent myEvent; public void setListener(MyListener myListener){ this.myListener = myListener; } private void handleListener(MyEvent myEvent){ //触发监听 this.myListener.handle(myEvent); } public void execute(){ //设置事件的类型为create myEvent = new MyCreateEventImpl(); System.out.println("create start!"); this.handleListener(myEvent); System.out.println("create end!"); } //调用被监听的类,测试监听效果 public static void main(String[] args) { MyCreateAction action = new MyCreateAction(); MyListenerImpl myListener = new MyListenerImpl(); //设置监听器的实现 action.setListener(myListener); action.execute(); }}?
?
输出的结果为:
?
create start!
myListener get a create event!
create end!
?
至此,监听器模式的基本工作原理就已经十分清楚了。
有些东西听起来很深奥,只要花时间看一下,再动手实验一把,马上就豁然开朗了~
?
?
?