Java中的观察者模式(Observer Pattern)学习

来源:互联网 发布:pc访问mac共享文件夹 编辑:程序博客网 时间:2024/05/18 00:20
  1. 是什么?(观察者模式的定义)

    是对象间的一种一个(Observable)对多个(Observer)的依赖关系,当一个对象的状态发送改变时,所依赖于它的对象都得到通知并被自动更新。

    理解:

    • 他强调的是一种依赖关系中的,被观察者变化后通知其他观察者的自发性,对于被观察者(Observable)与观察者(Observer)的数量并没有严格的限制,也特定的需求下也可以实现一对一(例如对button监听)、多对一等多种形式组合。
    • 类似于多态的一种实现。
  2. 基本组成
    Subject:目标对象,或者说被观察对象。
    Observer:观察者的接口
    ConcreteSubject:实际的被观察对象。
    ConcreteObserver:实际的观察者对象。
  3. 直观结构图
    其中Observer和Observable可以是实体类,抽象类,或者接口
  4. 举个例子

我们要对同一个数字进行二进制、八进制和十六进制的转换,需要分别写三个类,去实现对输入数字的转换。当然对于最初的数据来源(我们传入的数据)类就是被观察者了,可以随意输入任何数字

4.1这个例子的整体直观图:

这里写图片描述
4.2具体实现:
步骤 1 创建 Subject 类。

Subject.java

import java.util.ArrayList;import java.util.List;public class Subject {   private List<Observer> observers       = new ArrayList<Observer>();   private int state;   public int getState() {      return state;   }   public void setState(int state) {      this.state = state;      notifyAllObservers();   }   public void attach(Observer observer){      observers.add(observer);         }   public void notifyAllObservers(){      for (Observer observer : observers) {         observer.update();      }   }    }

步骤 2 创建 Observer 类。

Observer.java

public abstract class Observer {   protected Subject subject;   public abstract void update();}

步骤 3 创建实体观察者类。

BinaryObserver.java

public class BinaryObserver extends Observer{   public BinaryObserver(Subject subject){      this.subject = subject;      this.subject.attach(this);   }   @Override   public void update() {      System.out.println( "Binary String: "       + Integer.toBinaryString( subject.getState() ) );    }}

OctalObserver.java

public class OctalObserver extends Observer{   public OctalObserver(Subject subject){      this.subject = subject;      this.subject.attach(this);   }   @Override   public void update() {     System.out.println( "Octal String: "      + Integer.toOctalString( subject.getState() ) );    }}

HexaObserver.java

public class HexaObserver extends Observer{   public HexaObserver(Subject subject){      this.subject = subject;      this.subject.attach(this);   }   @Override   public void update() {      System.out.println( "Hex String: "       + Integer.toHexString( subject.getState() ).toUpperCase() );    }}

步骤 4 使用 Subject 和实体观察者对象。

ObserverPatternDemo.java

public class ObserverPatternDemo {   public static void main(String[] args) {      Subject subject = new Subject();      new HexaObserver(subject);      new OctalObserver(subject);      new BinaryObserver(subject);      System.out.println("First state change: 15");       subject.setState(15);      System.out.println("Second state change: 10");          subject.setState(10);   }}

步骤 5 验证输出。

First state change: 15Hex String: FOctal String: 17Binary String: 1111Second state change: 10Hex String: AOctal String: 12Binary String: 1010

例子的来源


5.观察者模式的优缺点

  1. 优点:
    a.观察者和被观察者之间是抽象耦合关系,方便对特定功能的维护
    b.支持广播通信
    c.为实现类似多态的情况提供了可能
  2. 缺点:
    a.当依赖关系比较复杂时,一定要避免发生循环依赖,一旦发生循环依赖,就可能导致系统崩溃
    b.当“改变”发生时,要特别注意将这个“改变信号”发送给哪个观察者,并且核对发送给观察者的数量是否正确,避免 “改变信号” 发生多发或者错发的问题

参考:

http://www.runoob.com/design-pattern/observer-pattern.html
http://www.jianshu.com/p/bd833ba613fb
http://www.cnblogs.com/shijiacheng/p/5059067.html
http://www.cnblogs.com/mythou/p/3370340.html
http://blog.csdn.net/cauchyweierstrass/article/details/44593807

0 0
原创粉丝点击