面向对象设计模式之---观察者模式(Observer Pattern)

今天更新的设计模式是观察者模式。刚才稍微去看了一眼Web前端开发,很炫!很炫!

对于这个观察者模式,我就直接开门见山地直接放出定义和UML类图,后面再解释。

观察者模式的定义如下:

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 ——《大话设计模式》

UML类图如下:
面向对象设计模式之---观察者模式(Observer Pattern)_第1张图片

首先看到的是一个叫Subject的抽象类,这个Subject类可以解释为抽象的课题类,里面有一个Attach和Detach抽象方法,这意味着一个课题可以有多个观察者来观察,可以加入,可以退出。然后有一个Notify通知方法,当这个课题的状态发生变化的时候,逐一通知所有的观察者。接下来就是抽象的Observer类,也就是观察者类,里面只有一个抽象的Update的方法,这个方法就是被Subject类所调用,在通知的时候观察者做出响应的方法。再接下来就是继承Subject的ConcentrateSubject类和继承Observer的ConcentrateObserver类,ConcentrateSubject类的SubjectState属性规定了课题的状态,一旦这个状态被改变,将会影响所有的观察者。至于ConcrateObserver类中的observerState,规定了观察者的状态,受ConcentrateSubject具体课题的影响。一个具体的观察者类只关注一个具体的课题。

举个例子吧,比如股票涨跌这个课题,每一支股票肯定有很多人关注,这些人就是这支股票的观察者,假设有一天股票涨了,从某个层面上就通知了那些所有的观察者说股票可以卖出了。我们不妨把这个例子转变为代码:

import java.util.*;

//抽象的课题
abstract class Subject
{
  //观察者列表
  protected ArrayList oblist = new ArrayList();
  //添加观察者
  public void Attach(Observer o)
  {
    oblist.add(o);
  }
  //移除观察者
  public void Detach(Observer o)
  {
    oblist.remove(o);
  }
  //通知观察者
  public void Notify()
  {
    for(int i = 0 ; i < oblist.size() ; i++)
    {
      oblist.get(i).Update();
    }
  }
}

//抽象的观察者
abstract class Observer
{
  //对通知做出响应
  public abstract void Update();
}

//股票课题
class Stock extends Subject
{
  //具体课题状态
    private String subjectState;

   public void setSubjectState(String state)
   {
     this.subjectState = state;
   }

   public String getSubjectState()
   {
     return this.subjectState;
   }
}

//具体的观察者 具体的观察者观察一个具体课题
class Watcher extends Observer
{
    private String observerState;
   //Subject用以更新observerState
   private Stock subject;
   private String name;

   public Watcher(String name , Stock sub)
   {
        this.name = name;
      this.subject = sub;
   }

   public void Update()
   {
     //观察者的state与课题的state相关联
     this.observerState = subject.getSubjectState();
     System.out.println(this.name+" notified! State is " + this.observerState);
   }
}

public class Main
{
  public static void main(String args[])
  {
    Stock s = new Stock();
    s.Attach(new Watcher("股民A",s));
    s.Attach(new Watcher("股民B",s));
    s.setSubjectState("股票涨了!");
    s.Notify();
  }
}

运行结果为:
面向对象设计模式之---观察者模式(Observer Pattern)_第2张图片

显然,观察者模式的工作是在解除耦合,让双方都依赖抽象,而不是具体。

你可能感兴趣的:(设计模式)