Java设计模式之观察者模式

Java设计模式之观察者模式


前言

观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己!

观察者模式在业务层面上分推模型和拉模型,下面分别通过具体的例子来讲解这2中类型。

推模型

被观察者对象向观察者推送被观察者的详细信息,不管观察者是否需要,推送的信息通常是被观察者对象的全部或部分数据。

首先创建个被观察者

public class Observerable {
List<IObserver> observers = new ArrayList<>();

public boolean addObserver(IObserver observer) {
    return observers.add(observer);
}

public boolean removeObserver(IObserver observer) {
    return observers.remove(observer);
}

public void change(String msg) {
    for (IObserver iObserver : observers) {
        iObserver.notify(msg);
    }
   }
}

接着创建个观察者接口让具体观察者去继承

public interface IObserver {
   void notify(String msg);
}

具体的观察者类

public class ObserverImpl implements IObserver {
private String name;

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

@Override
public void notify(String msg) {
    System.out.println("name:" + this.name + " my receive msg la!");
  }
}

测试 (创建5个观察者实例,一个被观察者实例)

public class Main {
public static void main(String[] args) {
    // create observerable
    Observerable observerable = new Observerable();
    for (int i = 0; i < 5; i++) {
        IObserver observer = new ObserverImpl("jack" + i);
        observerable.addObserver(observer);
    }
    observerable.change("my is change...");
    }
}

拉模型

如果观察者需要更具体的信息,由观察者主动到被观察者对象中获取,相当于是观察者从被观察者对象中拉数据。一般这种模型的实现中,会把被观察者对象自身通过update()方法传递给观察者。

public interface IObserver {
    void notify(Observerable observerable);
}

接着创建具体的观察者类

public class ObserverImpl implements IObserver {
private String name;

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

@Override
public void notify(Observerable observerable) {
    Observerable observerable1 = observerable;
    System.out.println("name:" + this.name + " my receive msg la! observerable name: " + observerable1.getName());
    }
}

创建一个被观察者类

public class Observerable {
private String name;
private int age;

public String getName() {
    return name;
}

public int getAge() {
    return age;
}

public void setName(String name) {
    this.name = name;
}

public void setAge(int age) {
    this.age = age;
}
List<IObserver> observers = new ArrayList<>();

public boolean addObserver(IObserver observer) {
    return observers.add(observer);
}

public boolean removeObserver(IObserver observer) {
    return observers.remove(observer);
}

public void change(String msg) {
    for (IObserver iObserver : observers) {
        iObserver.notify(this);
        }
    }
}

测试用例

public class Main {
public static void main(String[] args) {
    // create observerable
    Observerable observerable = new Observerable();
    observerable.setName("jack");
    observerable.setAge(100);
    for (int i = 0; i < 5; i++) {
        IObserver observer = new ObserverImpl("jack" + i);
        observerable.addObserver(observer);
    }
    observerable.change("my is change...");
   }
}

总结

观察者模式在实际开发中还是用的比较多的,比如我们很熟悉的EventBus(如果你还不了解的化,欢迎查看EventBus 使用方法及源码分析
)库就是采用观察者模式来实现总体的逻辑。再有Java的java.util库里面,提供了一个Observable类以及一个Observer接口,构成JAVA语言对观察者模式的支持。

关于本文的demo下载地址

发布了80 篇原创文章 · 获赞 17 · 访问量 8万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览