观察者模式

Posted chen-ying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。

 

一、观察者模式

观察者模式又叫发布-订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时会通知所有的观察者对象,使它们能够自动地更新自己。当一个对象的改变需要改变其他的对象的时候就可以用观察者模式。

二、结构图

技术图片

Subject类是抽象的主题对象,也是抽象通知者,可以从Observer观察者对象引用的聚集里面添加或者删除;

Observer类是抽象观察者,在得到主题的通知时更新自己。

三、示例

import java.util.ArrayList;
import java.util.List;

//抽象通知者
abstract class Subject
    List<Observer> observers=new ArrayList<>();
    //增加观察者
    protected void attach(Observer observer)
        observers.add(observer);
    
    //移除观察者
    protected void detach(Observer observer)
        observers.remove(observer);
    
    //进行通知
    protected void notifying()
        for (Observer o :observers) 
            o.update();
        
    

//抽象观察者
abstract class Observer
    abstract void update();


//具体通知者,将有关状态存入具体观察者对象,
// 在具体主题的内部状态改变时,给所有登记过的观察者发出通知。
class ConcreteSubject extends Subject
    private String subjectState;
    //具体被观察者状态

    public String getSubjectState() 
        return subjectState;
    

    public void setSubjectState(String subjectState) 
        this.subjectState = subjectState;
    


//具体观察者
class ConcreteObserver extends Observer
    private String name;
    private String observerState;
    private ConcreteSubject subject;
    
    public ConcreteObserver(ConcreteSubject subject,String name)
        this.subject=subject;
        this.name=name;
    
    
    @Override
    void update() 
        observerState=subject.getSubjectState();
        System.out.println("观察者"+name+"的状态:"+observerState);
    



public class ObserverPattern 
    public static void main(String[] args) 
        ConcreteSubject s=new ConcreteSubject();
        s.attach(new ConcreteObserver(s,"one"));
        s.attach(new ConcreteObserver(s,"two"));
        s.attach(new ConcreteObserver(s,"three"));
    
        s.setSubjectState("ABC");
        s.notifying();
    

输出结果:

技术图片

四、观察者模式的不足

可以从上面的梳理中发现一些问题,

首先,抽象的观察者和抽象的通知者还是耦合的,那如果缺少通知者或者观察者的抽象类,那就无法完成工作了呀;

另外,观察者可能不一定是是更新状态这些抽象类中统一的操作,可能还会进行一些其他的操作,

这些是需要改进的问题。

 

以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

观察者模式是啥

观察者模式

设计模式之观察者模式

Android开发模式之观察者模式

[设计模式]观察者模式与订阅模式

设计模式-行为型模式-观察者模式