观察者模式在Java中的应用,附代码

说明:

译自Observer design Pattern in Java with Real world code Example

http://javarevisited.blogspot.sg/2011/12/observer-design-pattern-java-example.html

翻译只为更深入的学习,如果您发现错误很多,提示一下,我很感激,如果您发现不了错误,那只希望不要对您产生误导!

--------------------------------------------------------------------------------------------

1、什么是观察者模式:
正如其名,观察者模式是观察一些事物的变化,它在Java中是非常重要的一种设计模式。
假设你想得到一个特殊对象的变化,而不是等着这个对象发生变化时来通知你,这个时候可以使用观察者模式。
被观察者将作为一个主体对待(我理解为一个调度中心),用于观察对象变化的类被称为观察者。(Suppose you want to notify for change in
a particular object than you observer that object and changes are notified to you. Object which is being observed is refereed as
Subject and classes which observe subject are called Observer,这句翻译的有些纠结)在MVC(Model View
Controller)的设计框架中,观察者模式是非常有用的,它能及时的将Model层的改变反馈至View层,
并根据相应的修改进行更新。同时,观察者模式也是在中高级Java程序员面试中经常被问到的一种设计模式。

---------------------------------------------------------------------------------------------

2、观察者模式解决的问题:
如果我们对一些特殊对象的改变有要求,那么观察者模式就会变得很有用。
在处理对象的一些或者大部分的自动改变时,观察者模式将会降低对象之间的耦合程度。
在真实的世界,我们找一些例子来看,当订阅了一项新的手机连线业务时,无能用户在何时注册,
公司的所有业务部门将被自动通知,然后根据用户的状态来完成他们的工作,如确认用户的地址,如果状态正确,
将发给用户欢迎信息。

---------------------------------------------------------------------------------------------

3、观察者模式在Java中的应用
在Java中应用这种模式会非常的简单,程序员不需要做太多的工作。在java.util的包中,我们能找到相应的接口、类以及
方法来应用观察者模式。

Public Interface Observer:

应用了改接口的任何类在对象主体或者观察对象改变了其状态时将会得到相应的通知

Update(Observable Ob, Object arg): 这个方法在对象主体或者观察对象改变了其状态时将被唤醒

Class Observable:
观察的主体,相当于一个调度中心,所有观察的对象在此注册,当想要观察的对象发生改变时,自己将得到中心的通知

Some Important Method(一些重要的方法):

addObserver(Observer o): 添加观察者到观察者集合中。

deleteObserver(Observer o): 删除观察者集合的一个观察者。

hasChanged(): 确认对象是否发生改变。

clearChanged(): 当被观察的对象没有改变或所有观察者都得到了改变通知时,此方法将被唤醒。

notifyObservers(): 当对象发生改变时,通知所有观察者。

----------------------------------------------------------------------------------------------

4、观察者模式在Java中应用的例子(上代码)
观察者模式在很多环境下是通用的,不仅仅是限于在Java中。你可以任意选择java.util.Observable
,java.util.Observer,或者自己编写Subject和Observer接口。我更倾向于编写自己的Subject和Observer接口。
OK,我将应用Java来编写观察者模式的例子。我的例子非常的简单,你有一个基于利率变化的贷款应用,当利率发生变化时,
系统将会通知报刊或者Internet显示出新的利率。为了实现这个应用我们需要一个Subject接口(类似于调度中心),其中包括
添加、删除和通知对象的方法,还需要一个Observer(观察者)接口,其中包括更新利率方法,这个方法在利率改变时由Subject的应用
类进行唤醒。

例子的代码如下(原文附上):

View Code
import java.util.ArrayList;

interface Observer {
       public void update(float interest);
}

interface Subject {
       public void registerObserver(Observer observer);

       public void removeObserver(Observer observer);

       public void notifyObservers();
}

class Loan implements Subject {
       private ArrayList observers = new ArrayList();
       private String type;
       private float interest;
       private String bank;

       public Loan(String type, float interest, String bank) {
              this.type = type;
              this.interest = interest;
              this.bank = bank;
       }

       public float getInterest() {
              return interest;
       }

       public void setInterest(float interest) {
              this.interest = interest;
              notifyObservers();
       }

       public String getBank() {
              return this.bank;
       }

       public String getType() {
              return this.type;
       }

       @Override
       public void registerObserver(Observer observer) {
              observers.add(observer);

       }

       @Override
       public void removeObserver(Observer observer) {
              observers.remove(observer);

       }

       @Override
       public void notifyObservers() {
              for (Observer ob : observers) {
                     System.out
                                  .println("Notifying Observers on change in Loan interest rate");
                     ob.update(this.interest);
              }

       }

}

class Newspaper implements Observer {
       @Override
       public void update(float interest) {
              System.out.println("Newspaper: Interest Rate updated, new Rate is: "
                           + interest);
       }
}

class Internet implements Observer {
       @Override
       public void update(float interest) {
              System.out.println("Internet: Interest Rate updated, new Rate is: "
                           + interest);
       }
}

public class ObserverTest {

       public static void main(String args[]) {
              // this will maintain all loans information
              Newspaper printMedia = new Newspaper();
              Internet onlineMedia = new Internet();

              Loan personalLoan = new Loan("Personal Loan", 12.5f,
                           "Standard Charterd");
              personalLoan.registerObserver(printMedia);
              personalLoan.registerObserver(onlineMedia);
              personalLoan.setInterest(3.5f);

       }
}

Read more: http://javarevisited.blogspot.com/2011/12/observer-design-pattern-java-example.html#ixzz1xBXIHM6s

-----------------------------------------------------------------------------------------------
5、观察者模式的好处
观察者模式最大的好处是降低对象之间的耦合(观察对象和被观察对象)。对象的主体(调度中心)只认识观察者而不关心他们具体做了什么
事情,所有的观察者在一个独立的事件中将得到通知(翻译纠结)。
------------------------------------------------------------------------------------------------
6、观察者模式的坏处
(1)debugging的时候会变得困难,因为当观察者之间存在联系的时候,观察者和被观察者之间的控制过程将变得非常复杂。
(2)对象的主体将持有观察者的所有属性,如果出现未注册的对象,将会产出内存问题,即当通知对象更新时,属性变了,对象未找到。

转载于:https://www.cnblogs.com/ddback-huwence/archive/2012/06/08/2541844.html

你可能感兴趣的:(观察者模式在Java中的应用,附代码)