JAVA 设计模式 观察者模式

用途

观察者模式 (Observer)

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

观察者模式是一种行为型模式

结构

图-观察者模式结构图

Subject : 主题类,保存所有订阅此主题的观察者,观察者的数量是任意的。定义添加观察者 (Attach) 删除观察者 (Detach) 的接口。

abstract class Subject {
    protected String name;
    protected String state;
    protected List<Observer> observers = new ArrayList<Observer>();
    
    public abstract String getState();    
    public abstract void setState(String state);
    public abstract void Notify();

public Subject(String name) {
        this.name = name;
    }
    
    public void Attach(Observer observer) {
        observers.add(observer);
    }
    
    public void Detach(Observer observer) {
        observers.remove(observer);
    }
}

Observer : 观察者类,定义更新接口 (Update),当收到 Subject 的通知时,Observer 需要同步更新信息。

abstract class Observer {
    protected String name;
    protected Subject subject;
    public Observer(String name, Subject subject) {
        this.name = name;
        this.subject = subject;
    }
    public abstract void Update();
}

ConcreteSubject : 具体主题类,存储对于这个主题感兴趣的所有观察者。当内部状态发生变化时,应通知所有登记的观察者 (Notify)

class ConcreteSubject extends Subject {
    public ConcreteSubject(String name) {
        super(name);
    }

@Override
    public String getState() {
        return state;
    }

@Override
    public void setState(String state) {
        this.state = state;
    }
    
    @Override
    public void Notify() {
        System.out.println("======= " + this.name + "主题发布新消息 =======");
        for (Observer observer : observers) {
            observer.Update();
        }
    }
}

ConcreteObserver : 具体观察者类,实现 Observer 的更新接口 (Update),以便和 Subject 同步状态信息。

class ConcreteObserver extends Observer {
    private String state;
    public ConcreteObserver(String name, Subject subject) {
        super(name, subject);
    }

@Override
    public void Update() {
        state = subject.getState();
        System.out.println(this.name + "收到当前状态:" + state);
    }
}

测试代码

public class ObserverPattern {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject("天气");    
        ConcreteObserver observer1 = new ConcreteObserver("张三", subject);
        ConcreteObserver observer2 = new ConcreteObserver("李四", subject);
        ConcreteObserver observer3 = new ConcreteObserver("王五", subject);
        
        subject.Attach(observer1);
        subject.Attach(observer2);
        subject.Attach(observer3);    
        subject.setState("今天下雨");
        subject.Notify();
        
        subject.Detach(observer2);
        subject.setState("明天天晴");
        subject.Notify();
    }
}

运行结果

======= 天气主题发布新消息 =======
张三收到当前状态:今天下雨
李四收到当前状态:今天下雨
王五收到当前状态:今天下雨
======= 天气主题发布新消息 =======
张三收到当前状态:明天天晴
王五收到当前状态:明天天晴

时间: 2024-11-06 12:41:45

JAVA 设计模式 观察者模式的相关文章

java设计模式--观察者模式和事件监听器模式

文章转载于:http://www.java2000.net/p9452 复习设计模式,看到observer观察者模式,说法是该模式和iterator迭代器模式类似已经被整合进jdk,但是jdk提供了两种接口: 一.java.util.Observer -- 观察者接口 对应: java.util.Observable --受查者根类 二.java.util.EventListener -- 事件监听/处理接口 对应: java.util.EventObject -- 事件(状态)对象根类 研究了

Java设计模式----观察者模式详解

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3899208.html 联系方式:[email protected] [正文] 一.观察者模式的定义: 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象.这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新.例如:GUI中的事件

Java设计模式の观察者模式(推拉模型)

目录: 一.观察者定义 二.观察者模式的结构(推模式实现) 三.推模型和拉模型(拉模式实现) 四.JAVA提供的对观察者模式的支持 五.使用JAVA对观察者模式的支持(自带推模式实现实例) 一.观察者定义 在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)

java设计模式-观察者模式

定义: 使用head First 设计模式中提到的说法 观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象.这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新. 简介: 观察者模式(Observer)完美的将观察者和被观察的对象分离开.举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上. 面向对象设计的一个原则是: 系统中的每个类将重点放在某一个功能上,而不是其他方面.

java设计模式-观察者模式学习

最近学习了设计模式中的观察者模式,在这里记录下学习成果. 观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到.只不过这个主体可以决定谁去观察他,以及做什么事情可以给别人观察. 引用大师的话就是 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时

Java设计模式—观察者模式

观察者模式 Observer 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己. 观察者模式的组成 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象类和接口来实现. 抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己. 具体主题角色:在具体主题内部状态改变时

Java设计模式——观察者模式

转自:http://www.cnblogs.com/V1haoge/p/6513651.html 观察者接口:Observer public interface Observer { void update(String message, String name); } 定义三个观察者:Bianyi1.Bianyi2.Bianyi3 /** * 便衣警察张昊天 */ public class Bianyi1 implements Observer { // 定义姓名 private String

Java设计模式之观察者模式

综述 观察者模式(Observer Pattern)也叫做发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.这个模式的一个最重要的作用就是解耦.也就是将被观察者和观察者进行解耦,使得他们之间的依赖性更小,甚至做到毫无依赖.在观察者模式中它定义了一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新.下面就来看一下观察者模式的具体实现. 观察者模式实现 在这里我们假定一个场景,在一个图书管理系统中,现在有这么一个需求

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

在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适合解决多种对象跟踪一个对象数据变化的程序结构问题. 观察者设计模式涉及到两种角色:主题(Subject)和观察者(Observer) 下面以java JDK中已有的观察者设计模式代码,展示使用: 1.主题(Subject):Observable类派生出来的子类,只需要定义各被监控的数据及getter