观察者模式浅谈

165 阅读2分钟

「这是我参与2022首次更文挑战的第39天,活动详情查看:2022首次更文挑战」。

一、什么是观察者模式

观察者模式:是一种行为模式,指被观察者与多个观察者之间存在依赖关系,当被观察者的状态发生变化,所有已注册的观察者都会收到通知并自动更新,观察者通过被观察者提供的方法完成注册。就像明星与粉丝的关系,明星是被观察者,粉丝是观察者,粉丝关注明星后,如果明星发布一条动态,所有关注的粉丝都会收到通知。

二、观察者模式的实现

下面就说说女神与追求者的关系,女神是被观察者,备胎们是观察者,通过加女神微信或者qq的方式关注女神。

public interface Observer {
    void update(String message);
}

抽象的观察者角色。

public class UserObserver implements Observer {
    private String name;

    public UserObserver(String name){
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(this.name + "看到了消息:" + message);
    }
}

具体观察者,实现了更新方法,收到通知时被调用。

public abstract class Subject {
    protected List<Observer> observerList = new ArrayList<>();

    public void attach(Observer observer){
        observerList.add(observer);
    }

    public void remove(Observer observer){
        observerList.remove(observer);
    }

    public abstract void notifyAllObserver(String message);
}

抽象被观察者,通过attach,remove方法实现添加观察者和移除观察者,以及观察者的通知方法。

public class GirlSubject extends Subject{
    @Override
    public void notifyAllObserver(String message) {
        System.out.println("我要发布新的动态:"+message);
        for (Observer observer : observerList) {
            observer.update(message);
        }
    }
}

具体被观察者,实现了通知方法,这里就是说的女神了。

public static void main(String[] args) {
    //被观察者 女神
    Subject subject = new GirlSubject();

    //观察者
    Observer observer1 = new UserObserver("张三");
    Observer observer2 = new UserObserver("李四");
    //关注女神   一般备胎都是向女神申请好友吧
    subject.attach(observer1);
    subject.attach(observer2);
    subject.notifyAllObserver("今天好想去逛街!");
}

先创建被观察者,然后创建两个观察者,观察者完成注册,调用通知接口。

image.png

三、总结

优点:被观察者与观察者是抽象耦合,降低了耦合性,符合依赖倒置原则,同时被观察者与观察者之间建立了一套触发机制。

缺点:观察者与被观察者之间的依赖关系未完全解除,可能出现循环引用的问题。当观察者很多的时候,一一通知观察者,程序的运行效率较差。

观察者模式的角色:

  1. 抽象主题角色:抽象被观察者角色,使用一个集合保存观察者,提供添加观察者,移除观察者以及通知所有观察者 的方法。
  2. 具体主题角色:具体被观察者角色,实现了通知所有观察者的方法。
  3. 抽象观察者角色:它是一个抽象类或接口,提供了一个更新自己的方法,收到通知的时候会被调用。
  4. 具体观察者角色:抽象观察者角色的实现。