定义
观察者模式又叫发布订阅模式,旨在将被观察者的动作触发通知给观察者.
如redis的发布订阅功能,消息队列的生产者和消费者.
实例
模拟消息队列生产消费,生产者继承Observable类,消费者实现Observer接口.
Observable类主要实现了新增观察者,删除观察者,通知观察者等方法.
Observer主要声明了收到消息后的update方法.
1.生产者接口
public interface IProducer {
public void produce(); //生产消息
}
2.生产者
public class Producer extends Observable implements IProducer{
//Observable实现了增加观察者,删除观察者,通知观察者等方法.
@Override
public void produce() {
System.out.println("生产消息");
super.setChanged();
super.notifyObservers("消息编号为0"+new Random().nextInt(10));
}
}
3.消费者
public class ConsumerA implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println("消费者A接受道消息,编号为"+arg.toString());
}
}
public class ConsumerB implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println("消费者B接受道消息,编号为"+arg.toString());
}
}
4.运行
public class Client {
public static void main(String[] args) {
//创建生产者,消费者
Producer producer = new Producer();
ConsumerA consumerA = new ConsumerA();
ConsumerB comsumerB = new ConsumerB();
//为给观察者添加观察者
producer.addObserver(consumerA);
producer.addObserver(comsumerB);
//被观察者执行动作会通知观察者
for(int i=0;i<5;i++){
producer.produce();
}
}
}
结果:
生产消息
消费者B接受道消息,编号为消息编号为03
消费者A接受道消息,编号为消息编号为03
生产消息
消费者B接受道消息,编号为消息编号为01
消费者A接受道消息,编号为消息编号为01
生产消息
消费者B接受道消息,编号为消息编号为08
消费者A接受道消息,编号为消息编号为08
生产消息
消费者B接受道消息,编号为消息编号为05
消费者A接受道消息,编号为消息编号为05
生产消息
消费者B接受道消息,编号为消息编号为01
消费者A接受道消息,编号为消息编号为01