观察者模式

Posted kjcc

tags:

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

模式的定义与特点

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。

优点:

  1. 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
  2. 目标与观察者之间建立了一套触发机制。

缺点:

  1. 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
  2. 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

模式的结构与实现

实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。

1. 模式的结构

观察者模式的主要角色如下。

  1. 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
  2. 具体主题(Concrete    Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
  3. 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
  4. 具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。

结构图:

             技术图片

2. 模式的实现

  1)抽象主题   

abstract class Subject {
    List<Observer> obj=new ArrayList<Observer>();
    //添加观察者
    public void addObserver(Observer o) {
        obj.add(o);
    } ;
    //删除观察者
    public void removeObserver(Observer o) {
        obj.remove(o);
    }
    //观察者执行的动作
    public abstract void notifyObserver();
}

2)观察这接口

public interface Observer {
    
    void observer();
}

3)具体的主题/目标类

 

public class ConcreteSubject  extends Subject{

    @Override
    public void notifyObserver() {
        for(Observer o:obj) {
            o.observer();
        }
    }
}

4)具体的观察者

    观察者1

public class Observer1 implements Observer{

    @Override
    public void observer() {
        System.out.println("我是观察者1");
    }

}

   观察者2

  

public class Observer2 implements Observer{

    @Override
    public void observer() {
        System.out.println("我是观察者2");
    }

}

5)测试类

 

public class ObserverTest {
    
    public static void main(String[] args) {
        ConcreteSubject  con=new ConcreteSubject();
        Observer1 ob1=new Observer1();
        Observer2 ob2=new Observer2();
        
        con.addObserver(ob1);
        con.addObserver(ob2);
        
        con.notifyObserver();
    }

}

6)测试结果

 

 技术图片

 

   

 

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

未调用 LiveData 观察者

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

如何为片段设置观察者

永远观察实时数据的片段

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式