Java观察者模式实例代码分析

发布时间:2022-02-28 09:16:56 作者:iii
来源:亿速云 阅读:138

Java观察者模式实例代码分析

引言

观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。观察者模式广泛应用于事件处理系统、GUI编程、消息队列等场景中。

本文将详细介绍Java中的观察者模式,并通过实例代码进行深入分析。我们将从观察者模式的基本概念、结构、实现方式以及实际应用场景等方面进行探讨。

观察者模式的基本概念

1. 观察者模式的定义

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,所有依赖于它的观察者对象都会收到通知并自动更新。

2. 观察者模式的角色

观察者模式主要包含以下几个角色:

观察者模式的结构

观察者模式的结构可以用以下类图表示:

classDiagram
    class Subject {
        +attach(Observer observer)
        +detach(Observer observer)
        +notifyObservers()
    }

    class Observer {
        +update()
    }

    class ConcreteSubject {
        -state
        +getState()
        +setState(state)
    }

    class ConcreteObserver {
        -subject
        +update()
    }

    Subject <|-- ConcreteSubject
    Observer <|-- ConcreteObserver
    Subject o-- Observer
    ConcreteObserver --> ConcreteSubject

1. Subject(主题)

Subject 是一个接口或抽象类,它定义了添加、删除和通知观察者的方法。具体主题类 ConcreteSubject 实现了这些方法,并维护了一个观察者列表。

2. Observer(观察者)

Observer 是一个接口或抽象类,它定义了一个 update() 方法,当主题状态发生变化时,观察者会调用该方法来更新自身状态。

3. ConcreteSubject(具体主题)

ConcreteSubjectSubject 的具体实现类,它维护了具体的状态,并在状态发生变化时通知所有观察者。

4. ConcreteObserver(具体观察者)

ConcreteObserverObserver 的具体实现类,它实现了 update() 方法,并在收到通知时执行具体的更新操作。

观察者模式的实现

1. 使用Java内置的观察者模式

Java提供了内置的观察者模式支持,主要通过 java.util.Observable 类和 java.util.Observer 接口来实现。下面是一个简单的示例代码:

import java.util.Observable;
import java.util.Observer;

// 具体主题类
class ConcreteSubject extends Observable {
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
        setChanged(); // 标记状态已改变
        notifyObservers(); // 通知观察者
    }
}

// 具体观察者类
class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        ConcreteSubject subject = (ConcreteSubject) o;
        System.out.println(name + " received update: " + subject.getState());
    }
}

// 测试类
public class ObserverPatternDemo {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();

        ConcreteObserver observer1 = new ConcreteObserver("Observer1");
        ConcreteObserver observer2 = new ConcreteObserver("Observer2");

        subject.addObserver(observer1);
        subject.addObserver(observer2);

        subject.setState("State1");
        subject.setState("State2");
    }
}

代码分析

  1. ConcreteSubjectConcreteSubject 继承自 Observable,并维护了一个状态 state。当状态发生变化时,调用 setChanged() 方法标记状态已改变,然后调用 notifyObservers() 方法通知所有观察者。

  2. ConcreteObserverConcreteObserver 实现了 Observer 接口,并重写了 update() 方法。当主题状态发生变化时,观察者会收到通知并执行 update() 方法。

  3. ObserverPatternDemo:在 main 方法中,我们创建了一个 ConcreteSubject 对象和两个 ConcreteObserver 对象。然后,我们将观察者添加到主题中,并改变主题的状态。每次状态改变时,观察者都会收到通知并打印出相应的信息。

2. 自定义观察者模式

虽然Java提供了内置的观察者模式支持,但在实际开发中,我们通常会自定义观察者模式,以便更好地控制观察者和主题之间的交互。下面是一个自定义观察者模式的示例代码:

import java.util.ArrayList;
import java.util.List;

// 主题接口
interface Subject {
    void attach(Observer observer);
    void detach(Observer observer);
    void notifyObservers();
}

// 观察者接口
interface Observer {
    void update(String state);
}

// 具体主题类
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
        notifyObservers();
    }

    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
}

// 具体观察者类
class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String state) {
        System.out.println(name + " received update: " + state);
    }
}

// 测试类
public class ObserverPatternDemo {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();

        ConcreteObserver observer1 = new ConcreteObserver("Observer1");
        ConcreteObserver observer2 = new ConcreteObserver("Observer2");

        subject.attach(observer1);
        subject.attach(observer2);

        subject.setState("State1");
        subject.setState("State2");
    }
}

代码分析

  1. Subject 接口Subject 接口定义了 attach()detach()notifyObservers() 方法,用于管理观察者列表并通知观察者。

  2. Observer 接口Observer 接口定义了 update() 方法,当主题状态发生变化时,观察者会调用该方法来更新自身状态。

  3. ConcreteSubject 类ConcreteSubject 实现了 Subject 接口,并维护了一个观察者列表。当状态发生变化时,调用 notifyObservers() 方法通知所有观察者。

  4. ConcreteObserver 类ConcreteObserver 实现了 Observer 接口,并重写了 update() 方法。当主题状态发生变化时,观察者会收到通知并执行 update() 方法。

  5. ObserverPatternDemo 类:在 main 方法中,我们创建了一个 ConcreteSubject 对象和两个 ConcreteObserver 对象。然后,我们将观察者添加到主题中,并改变主题的状态。每次状态改变时,观察者都会收到通知并打印出相应的信息。

观察者模式的应用场景

观察者模式在实际开发中有广泛的应用场景,以下是一些常见的应用场景:

1. 事件处理系统

在事件处理系统中,观察者模式可以用于处理用户界面事件、网络事件等。例如,当用户点击按钮时,按钮对象会通知所有注册的观察者(事件处理器)来处理点击事件。

2. GUI编程

在GUI编程中,观察者模式可以用于处理用户界面组件的状态变化。例如,当用户输入文本时,文本框对象会通知所有注册的观察者(事件处理器)来处理输入事件。

3. 消息队列

在消息队列系统中,观察者模式可以用于处理消息的发布和订阅。例如,当消息发布者发布一条消息时,所有订阅该消息的观察者(消费者)都会收到通知并处理消息。

4. 数据绑定

在数据绑定系统中,观察者模式可以用于处理数据的变化。例如,当数据模型发生变化时,所有依赖于该数据模型的视图(观察者)都会收到通知并更新自身状态。

观察者模式的优缺点

1. 优点

2. 缺点

总结

观察者模式是一种非常有用的设计模式,它通过定义对象之间的一对多依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。观察者模式广泛应用于事件处理系统、GUI编程、消息队列等场景中。

本文通过实例代码详细分析了Java中的观察者模式,并探讨了其基本概念、结构、实现方式以及实际应用场景。希望本文能够帮助读者更好地理解和应用观察者模式。

推荐阅读:
  1. java动态代理实例代码分析
  2. Java流程控制实例代码分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:C语言数据结构哈希表是什么

下一篇:C#怎么操作DataGridView设置单元格只读

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》