设计模式系列(1)---观察者模式解析与应用

在实际开发中,有时候会遇到多个不同类依赖某个目标类的情况,当目标类发生发生变化时,依赖目标类的其他类也要做出相应的调整,若要目标类和依赖类之间松耦合,则可以应用观察者模式。

1.什么是观察者模式
Head First设计模式是这样定义的:

观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新。

2.观察者模式的应用场景
(1)当系统中一组依赖对象需要与他们所依赖的对象之间进行一致性同步交互时,比如用户注册完毕后,系统自动给用户发送一封邮件进行验证,“注册”和“发邮件”之间就是需要一致性同步交互的场景,这两者需要实现需要独立,不能耦合在一起。注册成功后就要系统自动发邮件。
(2)当一个对象的改变需要同时改变其他关联的对象,但又不知道具体有多少关联对象需要改变时也适用观察者模式。典型的应用就是发布–订阅模式。

3.观察者模式的优点与不足

(1)优点:使得观察者和被观察者之间松耦合,支持广播通信,被观察者会向所有的观察者发出通知消息
(2)不足:如果需要进行相互之间的观察,则有可能产生死循环。

4.Java对观察者模式的应用

Java中有观察者模式使用的API

  • java.util.Observable 这是一个类,而非接口,主题需要继承这个类。
  • java.util.Observer 这是一个接口,监听者需要实现这个接口
    设计模式系列(1)---观察者模式解析与应用_第1张图片

设计模式系列(1)---观察者模式解析与应用_第2张图片

下面以注册后发邮件的场景为例,利用Java提供的API实现观察者模式的应用。

观察者类
public class Email implements Observer {

    public void sendEmail() {
        System.out.println("系统成功向X用户发送了邮件");
    }

    @Override
    public void update(Observable o, Object arg) {

        if (o instanceof UserInfo) {
            sendEmail();
        }

    }

}
//被观察者类
public class UserInfo extends Observable {

    private Email email = null;

    public UserInfo() {
        email = new Email();
        this.addObserver(email);
    }

    public void userRegister() {

        //...省去若干完成具体注册功能的实现
        System.out.println("用户注册成功");
        this.setChanged(); //设置变化点
        notifyObservers(email); //当注册完成时通知观察者发送邮件
    }

    public static void main(String[] args) {
        UserInfo userInfo = new  UserInfo();
        userInfo.userRegister();
    }
}

执行结果如下:
用户注册成功
系统成功向X用户发送了邮件

你可能感兴趣的:(设计模式系列(1)---观察者模式解析与应用)