likes
comments
collection
share

从原理到实践:面向对象设计中的经典模式-观察者模式

作者站长头像
站长
· 阅读数 40

7.1、概念

从原理到实践:面向对象设计中的经典模式-观察者模式

1)观察者注册到列表中,List observers = new ArrayList<>()

2)当被观察者state发生变化,就会调用notify通过到观察者

3)每个观察者执行自己的update()方法

Java中的观察者模式(Observer Pattern)是一种常用 行为型设计模式,它定义了一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

在观察者模式中,有两个重要的角色:被观察者和观察者。当被观察者的状态发生改变时,它会通知所有的观察者对象,并调用它们的方法来进行更新操作。

以下是一个简单的Java观察者模式的示例代码:

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

public class Subject {
    private List<Observer> observers = new ArrayList<>();
    private int state;
	//加入观察者
    public void attach(Observer observer) {
        observers.add(observer);
    }
    //去掉观察者
    public void detach(Observer observer) {
        observers.remove(observer);
    }
    //通知观察者
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }

    /*
    * 状态变化
     */
    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        notifyObservers();
    }
}
//观察者基类
public abstract class Observer {
    protected Subject subject;

    public Observer(Subject subject) {
        this.subject = subject;
        subject.attach(this);
    }

    public abstract void update();
}

public class BinaryObserver extends Observer {
    public BinaryObserver(Subject subject) {
        super(subject);
    }

    @Override
    public void update() {
        System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));
    }
}

public class OctalObserver extends Observer {
    public OctalObserver(Subject subject) {
        super(subject);
    }

    @Override
    public void update() {
        System.out.println("Octal String: " + Integer.toOctalString(subject.getState()));
    }
}

public class HexaObserver extends Observer {
    public HexaObserver(Subject subject) {
        super(subject);
    }

    @Override
    public void update() {
        System.out.println("Hex String: " + Integer.toHexString(subject.getState()).toUpperCase());
    }
}

public class Main {
    public static void main(String[] args) {
        Subject subject = new Subject();
        //加入观察者队列中
        new BinaryObserver(subject);
        new OctalObserver(subject);
        new HexaObserver(subject);

        System.out.println("First state change: 15");
        subject.setState(15);
        System.out.println("Second state change: 10");
        subject.setState(10);
    }
}

在上面的示例中,Subject 是被观察者角色,它包含一个状态 state 和一组观察者对象。当 state 发生改变时,它会通知所有的观察者对象,并调用它们的 update() 方法进行更新操作。

Observer 是观察者角色的抽象类,它包含了一个指向被观察者对象的引用。在 Observer 的子类中,实现了 update() 方法来响应被观察者状态的变化。

BinaryObserver、OctalObserver 和 HexaObserver 分别是具体的观察者类,它们继承了 Observer 类,并实现了各自的 update() 方法,在状态发生变化时进行相应的更新。

在 Main 方法中,我们创建一个 Subject 对象,并为它添加三个观察者对象:BinaryObserver、OctalObserver 和 HexaObserver。然后,我们设置了两次不同的状态值,每次修改状态后,所有的观察者对象都会得到通知并更新自己的状态。最终输出结果如下:

First state change: 15
Binary String: 1111
Octal String: 17
Hex String: F
Second state change: 10
Binary String: 1010
Octal String: 12
Hex String: A

可以看到,当状态发生改变时,所有的观察者对象都会得到通知,并根据自己的实现进行更新操作。

7.2、应用

以下是基于事务、监听器的场景使用观察者模式

以下是一个使用Java实现的观察者模式示例,包括监听器和事件:

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

/**
* 事件类,用于存储监听器和通知监听器
*/
class Event {
    private String name;
    private List<Listener> listeners;

    public Event(String name) {
        this.name = name;
        this.listeners = new ArrayList<>();
    }

    public void addListener(Listener listener) {
        this.listeners.add(listener);
    }

    public void removeListener(Listener listener) {
        this.listeners.remove(listener);
    }

    public void notifyListeners(Object object) {
        for (Listener listener : listeners) {
            listener.update(object);
        }
    }
}

/**
* 监听器接口,实现update方法来处理事件
*/
interface Listener {
    void update(Object object);
}

/**
* 使用示例
*/
public class ObserverDemo {
    public static void main(String[] args) {
        // 创建一个事件实例
        Event event = new Event("new_user");

        // 创建两个监听器实例
        Listener emailListener = new EmailListener();
        Listener messageListener = new MessageListener();

        // 向事件实例中添加监听器
        event.addListener(emailListener);
        event.addListener(messageListener);

        // 发出事件通知
        event.notifyListeners("Tom");
    }

    /**
* 邮件监听器,实现update方法来处理事件
*/
    static class EmailListener implements Listener {
        @Override
        public void update(Object object) {
            System.out.println("发送欢迎邮件给 " + object.toString());
        }
    }

    /**
* 短信监听器,实现update方法来处理事件
*/
    static class MessageListener implements Listener {
        @Override
        public void update(Object object) {
            System.out.println("发送短信给 " + object.toString());
        }
    }
}

在上面的示例中,Event类表示一个事件,Listener接口表示监听器。每个事件都有一些监听器,它们会在事件发生时被通知。在这个示例中,我们创建了两个监听器:EmailListener和MessageListener,它们分别向新用户发送欢迎邮件和短信。最后,我们向event实例中添加两个监听器,并触发了一个事件通知,通知所有监听器有新用户Tom加入。

==============================================

如果文章对你有帮助,不要忘记加个关注、点个赞!!!必回关!!!

转载自:https://juejin.cn/post/7226387497566912572
评论
请登录