GoF--观察者模式

  观察者模式定义了对象间的一对多依赖关系,让一个或多个观察者对象观察一个主题对象。当主题对象的状态发生变化时,系统恩那个通知所有的依赖于此对象观察者对象,从而使得观察者对象能够自动更新。

  在观察者模式中,被观察的对象尝尝被称为目标或主题(Subject),依赖的对象被称为观察者(Observer)。

  Interface:Observer

package edu.pri.lime._9_3_9.bean;

//观察者接口,程序中所有观察者都应该实现该接口
public interface Observer {

//    Observable:代表被观察对象,即目标或主题
//    Observable:是一个抽象基类,程序中被观察者应该继承该抽象基类。
//    arg:
    void update(Observable o,Object arg);

}

  Class:Observable

package edu.pri.lime._9_3_9.bean;

import java.util.ArrayList;
import java.util.List;
/*
 * 该抽象类是所有被观察者(主题)的基类,
 * 它提供了registObserver()方法用于注册一个新的观察者;
 * 并提供了一个removeObserver()方法用于删除一个已注册的观察者;
 * 当具体被观察对象(主题)的状态发生改变时,具体被观察对象(主题)会调用notifyObservers()方法来通知所有观察者。
 */
public abstract class Observable {

//    用一个List来保存该对象上所有绑定的事件监听器
    List<Observer> observers = new ArrayList<Observer>();
//    用于从该主题上注册观察者
    public void registObserver(Observer o){
        observers.add(o);
    }
//    用于从该主题上注册观察者
    public void removeObserver(Observer o){
        observers.remove(o);
    }
//    通知该主题上注册的所有观察者
    public void notifyObservers(Object value){
//        遍历注册到该主题上的所有被观察者
        for(Observer o : observers){
//            显式调用每个观察者的update()方法
            o.update(this, value);
        }
    }
}

  Class:Product

package edu.pri.lime._9_3_9.bean;

public class Product extends Observable {

    private String name;
    private double price;
    public Product() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Product(String name, double price) {
        super();
        this.name = name;
        this.price = price;
    }
//    当程序调用name的setter方法来修改Product的name成员变量时,
//    程序自然触发该对象上注册的所有观察者
    public void setName(String name) {
        this.name = name;
        notifyObservers(name);
    }
//    当程序调用price的setter方法来修改Product的price成员变量时,
//    程序自然触发该对象上注册的所有观察者
    public void setPrice(double price) {
        this.price = price;
        notifyObservers(price);
    }
    public String getName() {
        return name;
    }
    public double getPrice() {
        return price;
    }

}

  Class:NameObserver

package edu.pri.lime._9_3_9.bean;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class NameObserver implements Observer {

//    实现观察者必须实现的update方法
    public void update(Observable o, Object arg) {
        if(arg instanceof String){
            String name = (String) arg;
            JFrame f = new JFrame("观察者");
            JLabel l = new JLabel("名称改变为:" + name);
            f.add(l);
            f.pack();
            f.setVisible(true);
            System.out.println("名称观察者:" + o + "物品名称已改变为:" + name);
        }
    }
}

  Class:PriceObserver

package edu.pri.lime._9_3_9.bean;

public class PriceObserver implements Observer {

//    实现观察者必须实现的update()方法
    public void update(Observable o, Object arg) {
        if(arg instanceof Double){
            System.out.println("价格观察者:" + o + "物品价格已改变为:" + arg);
        }
    }

}

  Class:Test

package edu.pri.lime._9_3_9.main;

import edu.pri.lime._9_3_9.bean.NameObserver;
import edu.pri.lime._9_3_9.bean.PriceObserver;
import edu.pri.lime._9_3_9.bean.Product;

public class Test {

    public static void main(String[] args) throws InterruptedException{
//        创建一个主题对象
        Product pro = new Product("桌子",300);
//        创建两个观察者对象
        NameObserver nameObs = new NameObserver();
        PriceObserver priObs = new PriceObserver();
//        向主题对象上注册两个观察者对象
        pro.registObserver(nameObs);
        pro.registObserver(priObs);
//        程序调用setter方法来改变Product的name和price成员变量
        pro.setName("高级书桌");
        Thread.sleep(3000);
        pro.setPrice(321d);
    }
}

  

时间: 2024-10-29 19:06:47

GoF--观察者模式的相关文章

RxJava开发精要2-为什么是Observables?

原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转载权,未经允许,不得转载! 译者 : yuxingxin 项目地址 : RxJava-Essentials-CN 为什么是Observables? 在面向对象的架构中,开发者致力于创建一组解耦的实体.这样的话,实体就可以在不用妨碍整个系统的情况下可以被测试.复用和维护.设计这种系统就带来一个棘手的负面影响:维

python 高性能编程之协程

用 greenlet 协程处理异步事件 自从 PyCon 2011 协程成为热点话题以来,我一直对此有着浓厚的兴趣.为了异步,我们曾使用多线程编程.然而线程在有着 GIL 的 Python 中带来的性能瓶颈和多线程编程的高出错风险,"协程 + 多进程"的组合渐渐被认为是未来发展的方向.技术容易更新,思维转变却需要一个过渡.我之前在异步事件处理方面已经习惯了回调 + 多线程的思维方式,转换到协程还非常的不适应.这几天我非常艰难地查阅了一些资料并思考,得出了一个可能并不可靠的总结.尽管这个

面向对象程序设计(OOP设计模式)-行为型模式之观察者模式的应用与实现

课程名称:程序设计方法学 实验5:OOP设计模式-行为型模式的应用与实现 时间:2015年12月02日三,第3.4节地点:理1 一.实验目的 加深对行为型设计模式的理解以及在开发中的实际应用能力. 二.实验内容 实验内容: 在工业自动化系统中,作为监控端,要求能够实时采集生产线上每一个测点的数据,并根据事先设定好的条件来发出告警.目前,系统可以支持的告警方式在形式上呈现多样化的趋势,主要包括屏幕显示告警.语音发声告警.电话拨号告警.电子邮件告警.手机短信告警以及其他可利用的告警方式等.在设置监控

设计模式18:Observer 观察者模式(行为型模式)

Observer 观察者模式(行为型模式) 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象)都将得到通知.如果这样的以来对象关系过于紧密,将使软件不能很好地抵御变化. 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. 意图(Intent) 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更

外行观察者模式

一.引子 还记得警匪片上,匪徒们是怎么配合实施犯罪的吗?一个团伙在进行盗窃的时候,总    有一两个人在门口把风——假设有什么风吹草动.则会马上通知里面的同伙紧急撤退. 或许放风的人并不一定认识里面的每个同伙.而在里面或许有新来的小弟不认识这个放风的.可是这没什么,这个影响不了他们之间的通讯.由于他们之间有早已商定好的暗号. 呵呵,上面提到的放风者.偷窃者之间的关系就是观察者模式在现实中的活生生的样例. 二.定义与结构 观察者(Observer)模式又名公布-订阅(Publish/Subscri

有趣的GOF四人组

GoF,它是鉴于java的语言基础知识和J2EE框架之间的桥梁,俗称GOF设计模式----四人组.在查找资料的时候无意中看GOF设计模式,不知道是什么模式,就查找了一下资料,它描述了在软件编程过程中的23种模式.很生动形象的阐述了这23中模式的在怎样的场景中使用中.其中的工厂方法模式.装饰模式.门面模式等这些都是我们常见的编程模式,在我们的开发过程中经常用到.下面是我转载的知识点 GOF的设计模式是一座"桥" 就Java语言体系来说,GOF的设计模式是Java基础知识和J2EE框架知识

C#之观察者模式

Iron之观察者 引言 上一篇说的职责链模式,很有意思的一个模式,今天这个模式也是很有意思的一个模式,还是不啰嗦了直接进入主题吧. 场景介绍:在上一遍中说到用到部件检测,很巧妙的让调用者和处理者解耦了(没有看过上篇的文章也没关系,只是剧情是要接着发展的),要把部件拿去检测是要让个人来盯着看呢?还是部件生产好了自动就被拿去检测了呢?毋庸置疑必须是自动化的. 看一下部件的结构 1 /// <summary> 2 /// 部件 3 /// </summary> 4 public clas

NET设计模式 第二部分 行为型模式(18):观察者模式(Observer Pattern)

概述 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化.使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.[GOF <设计模式>] 结构图 图1 Observer模式结构图 生活中的例子

游戏中的设计模式(1)--观察者模式

作为本系列文章的第一篇,笔者在此想表达一下个人对于设计模式的一些理解.因此笔者自问自答几个问题.1,什么是设计模式?2,在软件快速迭代的今天,设计模式是否重要?3,四人帮提出了23个设计模式,是不是设计问题无出其右?4,设计模式和语言是什么关系?5,设计模式和面向对象的关系? 1,什么是设计模式? 拿百度谷歌一下,可以找到各种各样的回答,只是很多的回答实在是会让人找不到北,模式这个词确实很高大上,因此常常出没于学术界.针对设计模式这个问题,笔者对设计模式的理解是,设计模式可以认为是解决某一类问题

为什么GOF的23种设计模式里面没有MVC?

GoF (Gang of Four,四人组, <Design Patterns: Elements of Reusable Object-Oriented Software>/<设计模式>一书的作者:Erich Gamma.Richard Helm.Ralph Johnson.John Vlissides)并没有把MVC提及为一种设计模式,而是把它当做"一组用于构建用户界面的类集合".在他们看来,它其实是其它三个经典的设计模式的演变:观察者模式(Observer