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

7.1、概念

1)观察者注册到列表中,List<Observer> 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加入。

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栈江湖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值