设计模式(16)-观察者模式

定义
观察者模式又叫发布订阅模式,旨在将被观察者的动作触发通知给观察者.
如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

猜你喜欢

转载自blog.csdn.net/chixiaoen/article/details/79423781