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下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值