23种设计模式 第三部分 关系模式(3)观察者模式

原创 2016年08月29日 23:15:01


理解

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,她的所有依赖者都会受到通知并自动更新。

简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化。


MySubject类就是我们的主对象(类似于期刊),Observer1和Observer2是依赖于MySubject的对象(类似于订阅者)。当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类中定义着需要监控的对象列表,可以对其进行修改:增加或删除被监控对象,且当MySubject变化时,负责通知在列表内存在的对象。

实现

subject接口和实现类:

public interface Subject {  
      
    /*增加观察者*/  
    public void add(Observer observer);  
      
    /*删除观察者*/  
    public void del(Observer observer);  
      
    /*通知所有的观察者*/  
    public void notifyObservers();  
      
    /*自身的操作*/  
    public void operation();  
}  
public abstract class AbstractSubject implements Subject {  
  
    private Vector<Observer> vector = new Vector<Observer>();  
    @Override  
    public void add(Observer observer) {  
        vector.add(observer);  
    }  
  
    @Override  
    public void del(Observer observer) {  
        vector.remove(observer);  
    }  
  
    @Override  
    public void notifyObservers() {  
        Enumeration<Observer> enumo = vector.elements();  
        while(enumo.hasMoreElements()){  
            enumo.nextElement().update();  
        }  
    }  
}  
public class MySubject extends AbstractSubject {  
  
    @Override  
    public void operation() {  
        System.out.println("update self!");  
        notifyObservers();  
    }  
  
}  
Observer接口和实现类:

public interface Observer {  
    public void update();  
}  

public class Observer1 implements Observer {  
  
    @Override  
    public void update() {  
        System.out.println("observer1 has received!");  
    }  
}  
public class Observer2 implements Observer {  
  
    @Override  
    public void update() {  
        System.out.println("observer2 has received!");  
    }  
}  
测试:

public class ObserverTest {  
  
    public static void main(String[] args) {  
        Subject sub = new MySubject();  
        sub.add(new Observer1());  
        sub.add(new Observer2());  
          
        sub.operation();  
    }  
}  
输出:

pdate self!
observer1 has received!
observer2 has received!
其实可以用java API内置的观察者模式,原理类似。

java.util包内包含最基本的Observer接口和Observable类,使用方便。可以支持pull或者 push两种方式。java.util.Observable中有两种notifyObservers()方法,一种是notifyObservers(),一种是notifyObservers(Object arg),如果想“推”(push)数据给观察者,就可以吧数据当做数据对象传给notifyObservers(Object arg)方法。否则,观察者就必须从可观察对象中“拉”(pull)数据。












版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

23种设计模式 第三部分 关系模式(2)模板方法模式

理解 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。 泡茶和泡咖啡,步骤很相似: 两种饮品其分别的做法如下代码: public class Coffee { ...

23种设计模式 第三部分 关系模式(1)策略模式

理解 策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可...

23种设计模式 第三部分 关系模式(4)迭代子模式

理解 迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象...

23种设计模式 第三部分 关系模式(5)责任链模式

理解  责任链模式(Chain of Responsibility),有多个对象,每个对象持有下一个对象的引用,则可以形成一条链,请求在这条链上传递,直到某个对象决定处理该请求。但是发出请求者并不知...

java23种设计模式之观察者模式

  • 2011年05月20日 14:10
  • 3KB
  • 下载

《23种设计模式 Lua篇》 - 观察者模式

当观察哨发现入侵者,通知正在上班的警卫。

23种设计模式(15):观察者模式

本文主要介绍设计模式中的观察者模式。

23种设计模式13---观察者模式

观察者模式 &mesp;观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。角色抽...

(四)23种设计模式之我见-----------观察者模式(Observer)

设计模式这本书中对观察者模式做了如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。下面我对深入浅出设计模式这本书中的观察者模式,进行自己...

23种设计模式(15)-观察者模式

观察者模式 一、定义 二、结构 具体案例 推模型和拉模型  三、Java提供的对观察者模式的支持 Observer接口 Observable类 一、定义 观察者模...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:23种设计模式 第三部分 关系模式(3)观察者模式
举报原因:
原因补充:

(最多只允许输入30个字)