观察者模式(Observer、Observable)

观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。


实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——撤销注册”的形式。

1、观察者

  (Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。

2、被观察对象

  被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。

3、撤销观察

  观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。


Observer

一、Observer模式的意图:

                在对象的内部状态发生变化时,自动通知外部对象进行响应。

        二、Observer模式的构成:

               ·被观察者:内部状态有可能被改变,而且又需要通知外部的对象

               ·观察者:需要对内部状态的改变做出响应的对象

        三、Observer模式的Java实现:

                Java的API中已经为我们提供了Observer模式的实现。具体由java.util.Observable类和java.util.Observer接口完成。

                前者有两个重要的方法:

                       ·setChanged:设置内部状态为已改变

                       ·notifyObservers(Object obj):通知观察者所发生的改变,参数obj是一些改变的信息

                后者有一个核心方法:

                       ·update(Object obj):相应被观察者的改变,其中obj就是被观察者传递过来的信息,该方法会在notifyObservers被调用时自动调用。

              下面是Observer模式的实现过程:

                     ·创建一个被观察者,继承java.util.Observable

                     ·创建一个观察者,实现java.util.Observer接口

                    · 注册观察着,调用addObserver(Observer observer)

                    ·在被观察者改变对象内部状态的地方,调用setChanged()方法,然后调用notifyObservers(Object)方法,通知被观察者

                   ·在观察者的update(Object)方法中,对改变做出响应。

        四、Observer模式的好处:

                 1.Observer模式的优点:

                       ·被观察者只需要知道谁在观察它,无需知道具体的观察细节

                       ·被观察者一旦发生变化,只需要通过广播的方式告知观察者,至于消息如何到达则不需知道。这样的话无疑消除了被观察者和观察者之间通信的硬编码

                       ·当一个被观察者同时被多个观察着观察时,观察者可以只选择自己感兴趣的事件,而忽略其它的事件
   
                      ·多个观察者组合起来可以形成一个观察链,如果一旦需要回滚多个操作,此时观察链可以发挥作用

                      ·观察者可以实时对被观察对象的变化做出响应,例如自动告警、中断运行等


                2.运用Observer模式可以

                     ·屏蔽线程间的通信机制:例如两个线程之间,主线程可以作为观察者,执行线程是被观察者。彼此之间只知道对方存在,但不知道之间通信的细节

                    ·消除硬编码:如果没有Observer模式,则只能采用回调的模式,或者在代码中显示地调用观察者

                    ·优化异常机制:特别适合在异常发生时向顶层监控,减少try-catch代码量


代码例子:

观察者1. MailObserver

public class MailObserver implements Observer {

	/**
	 * 这个类取名为MailObserver,顾名思义,她是一个用来发送邮件的观察者
	 */
	public void update(Observable o, Object arg) {
		System.out.println("发送邮件的观察者已经被执行");
	}
}



观察者2. JMSObserver


public class JMSObserver implements Observer {

	public void update(Observable o, Object arg) {
		System.out.println("发送消息给jms服务器的观察者已经被执行");
	}
}



被观察者 Subject

import java.util.Observable;
import java.util.Observer;

public class Subject extends Observable{      
          
    /**    
     * 业务方法,一旦执行某个操作,则通知观察者    
     */     
    public void doBusiness(){      
        if (true) {      
            super.setChanged();      
        }      
        notifyObservers("现在还没有的参数");      
    }      
     
          
    public static void main(String [] args) {      
        //创建一个被观察者      
        Subject subject = new Subject();      
              
        //创建两个观察者      
        Observer mailObserver = new MailObserver();      
        Observer jmsObserver = new JMSObserver();      
              
        //把两个观察者加到被观察者列表中      
        subject.addObserver(mailObserver);      
        subject.addObserver(jmsObserver);      
              
        //执行业务操作      
        subject.doBusiness();      
    }      
}  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值