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种设计模式汇总整理

设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型...
  • jason0539
  • jason0539
  • 2015年04月09日 10:57
  • 75159

GOF23设计模式之观察者模式之理解

观察者模式
  • lk142500
  • lk142500
  • 2015年04月17日 21:42
  • 665

23 种设计模式 记忆技巧

记忆口决:抽工建原单代桥组装享适门观模策状备迭访中命解职第一行为创建型模式。第二行为结构型模式。第三行为行为模式。   想象如下的场景:大家都在抽出工夫来建造原单。原单的内容是代桥来组装享适门。大家都...
  • liyongjin2009
  • liyongjin2009
  • 2011年05月26日 18:32
  • 754

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

当观察哨发现入侵者,通知正在上班的警卫。
  • tubufeng
  • tubufeng
  • 2014年08月26日 19:53
  • 1544

23种设计模式概要及易懂的例子

23种设计模式(分为三大类)   因为内容是从有道云笔记挪过来的,所以排版有点丑,如有不足或错误还望指点。。 注意,一些设计模式之间的(代码)"形式"虽然相同或相似,但是"语义"是截然不同的...
  • ycl295644
  • ycl295644
  • 2015年08月20日 09:04
  • 3496

23种设计模式及java实现

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模...
  • zmx729618
  • zmx729618
  • 2016年05月27日 14:02
  • 2111

23种设计模式全解析-- 设计模式看这一篇就够了

二、设计模式的六大原则 总原则:开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一...
  • AlbertFly
  • AlbertFly
  • 2016年08月22日 11:34
  • 3415

设计模式的意义与23种常见模式介绍

自从计算机诞生以来,生产效率大大的提高,尤其是微型计算机能够进入千家万户。让大众能够利用强大的计算资源,但是单纯的计算机硬件虽然能够提供机械强大的计算能力,但是要有效的利用这样的能力就需要用软件去操作...
  • micro_hz
  • micro_hz
  • 2016年12月03日 16:08
  • 1019

[设计模式]二十三种设计模式

分类: DesignPattern(8)  目录(?)[+] 原文地址:http://blog.csdn.net/zhangerqing 一、设计模...
  • qq3965470
  • qq3965470
  • 2016年08月09日 23:54
  • 5019

23种常用设计模式(C++)

23种常用设计模式(C++)
  • u012212811
  • u012212811
  • 2014年11月05日 06:17
  • 2437
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:23种设计模式 第三部分 关系模式(3)观察者模式
举报原因:
原因补充:

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