设计模式之观察者模式

观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会得到通知并自动更新。以下是一个简单的示例,说明如何使用观察者模式来实现事件监听。

假设我们要设计一个邮件订阅系统,它允许用户订阅和取消订阅不同类型的邮件,例如新闻、促销和服务等。此时,我们可以使用观察者模式来实现该系统,具体实现如下:

  1. 定义主题接口:首先,我们需要定义一个Subject接口,作为所有主题类的基类,它包含了注册、注销和通知观察者的方法。
public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String message);
}
  1. 定义观察者接口:然后,我们定义一个Observer接口,作为所有观察者类的基类,它包含了接收通知并进行处理的方法。
public interface Observer {
    void update(String message);
}
  1. 实现主题类:最后,我们可以创建具体的主题类,例如EmailSubject,它实现了Subject接口,并负责管理不同类型的邮件订阅者列表,并通知它们有新邮件到达。
import java.util.ArrayList;
import java.util.List;

public class EmailSubject implements Subject {
    private List<Observer> observers;
    private String message;

    public EmailSubject() {
        this.observers = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer observer) {
        if (!observers.contains(observer)) {
            observers.add(observer);
        }
    }

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

    @Override
    public void notifyObservers(String message) {
        this.message = message;
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}
  1. 实现观察者类:同时,我们还需要创建具体的观察者类,例如EmailSubscriber,它实现了Observer接口,并在主题发生变化时接收并处理通知。
public class EmailSubscriber implements Observer {
    private final String email;

    public EmailSubscriber(String email) {
        this.email = email;
    }

    @Override
    public void update(String message) {
        System.out.println("Received email '" + message + "' from " + email);
    }
}
  1. 使用观察者模式:现在,我们可以创建邮件订阅系统,例如:
EmailSubject emailSubject = new EmailSubject();
emailSubject.registerObserver(new EmailSubscriber("example@gmail.com"));
emailSubject.notifyObservers("News: Welcome to our newsletter!");

这里我们创建了一个EmailSubject对象,并向其中注册了一个邮箱订阅者。然后,我们使用notifyObservers()方法发送一封新邮件,并由订阅者接收并处理该邮件。输出结果为:

Received email 'News: Welcome to our newsletter!' from example@gmail.com

这样就实现了一个简单的观察者模式,使得主题与观察者之间松耦合,易于扩展和维护。如果有更多的订阅者加入或退出,只需要调用相应的注册或注销方法即可;如果有更多的消息类型需要发送,只需要创建新的主题类即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值