「设计模式」观察者模式

这是我参与更文挑战的第6天,活动详情查看: 更文挑战

定义

定义对象之间 一种一对多的依赖关系,使得每当一个对象改变状态,则所有注册观察的都会得到通知,并且自动更新

举一个例子:掘金是一个技术论坛, 大家都关注我,然后我发布文章, 所有关注我的人都能得到收到我更新文章的提示,这就是一个简单的观察者例子,代码见下边实现

UML类图

Main.png

  • Subject(抽象主题): 也就是被观察者的角色
  • JuejinSubject(具体主题): 是一个继承抽象主题的类,注册、解注册、处理观察者的变化
  • Observe(观察者): 观察者是一个由对象水岸的接口,根据主题中的更改而进行更新。
  • Coder (具体观察者): 该角色实现抽象观察者角色所定义的更新接口,以便在主题状态发生改变的时候更新自生的状态

代码实现

SubJect抽象一个主题 ,主要是注册、解注册、通知订阅者几个方法

public abstract class SubJect {
    //注册订阅
    void registerObserver(Observer observer) { }
    //解注册订阅
    void unRegisterObserver(Observer observer){}
     //通知订阅者
    void notifyObserver(String message){}
}
复制代码

JuejinSubject具体主题类,实现抽象主题的方法

public class JuejinSubject extends SubJect {
    private List<Observer> observerList = new ArrayList<>();  //订阅者容器,Observer

    @Override
    public void registerObserver(Observer observer) {
        if (!observerList.contains(observer)) {
            observerList.add(observer);  // 添加订阅关系
        }
    }

    @Override
    public void unRegisterObserver(Observer observer) {
        if (observerList.contains(observer)) {
            observerList.remove(observer);  //移除订阅关系
        }
    }

    @Override
    public void notifyObserver(String message) {
        for (Observer observer :
                observerList) {
            observer.notify(message);  //通知
        }
    }
}

复制代码

Observer 抽象观察者,定义一个更新接口

public interface Observer {
    void notify(String message);
}
复制代码

Coder具体观察者

class Coder implements Observer {
    private String name;
    public Coder(String name){
        this.name = name;
    }
    @Override
    public void notify(String message) {
        System.out.println("hi " +name +" 您订阅的juejin主题更新啦,更新内容 " + message);
    }
}
复制代码

Test测试类代码

public class Test {
    public static void main(String[] args) {
        JuejinSubject juejinSubject = new JuejinSubject(); //掘金被观察者对象

        //程序员观察者
        Coder coderA = new Coder("程序员A");
        Coder coderB = new Coder("程序员B");
        Coder coderC = new Coder("程序员C");
        Coder coderD = new Coder("程序员D");

        //注册观察
        juejinSubject.registerObserver(coderA);
        juejinSubject.registerObserver(coderB);
        juejinSubject.registerObserver(coderC);
        juejinSubject.registerObserver(coderD);

        //通知观察者
        juejinSubject.notifyObserver("丁大忽悠发布新文章啦,快来查看吧>_>");
    }
}

复制代码

输出:

输出.png

Android中著名的库 EventBus就是一个完成的观察者模式的例子.有时间分析给大家.

总结

观察者模式重要的作用就是对象接偶,将观察者与被观察者完全接偶,只依赖于Observer和Observable抽象.
合理的使用设计模式可以使代码结构更加清晰,同时还能满足不同的小模块符合单一职责,以及开闭原则,从而达到前面写工厂模式说的,提高代码的可扩展性,维护成本低的特点。

优点
  • 观察者和被观察者之间是抽象耦合,应对业务变化
  • 增强系统灵活性,可扩展
缺点
  • 再应用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者和多个观察者,代码量会比较多,开发和测试比较复杂.

以上就是观察者模式的全部内容,喜欢的话点个赞吧.

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享