1、观察者模式定义:
当多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式。
2、观察者模式优点:
降低目标与观察者的耦合度但没有完全解除,建立起一套监听机制。
3、观察者模式结构:
- 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
- 具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
- 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
- 具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
4、代码
/**
* 抽象生产者(Subject)
*/
abstract class Product {
protected List<Consumer> consumerList = new ArrayList<>();
//增加观察者方法
public void add(Consumer consumer) {
consumerList.add(consumer);
}
//删除观察者方法
public void remove(Consumer consumer) {
consumerList.remove(consumer);
}
public abstract void notifyObserver(); //通知观察者方法
}
/**
* 具体生产者(Concrete Subject)
*/
public class ProductA extends Product {
@Override
public void notifyObserver() {
System.out.println("-----ProductA生产消息-----");
for (Consumer consumer : consumerList) {
consumer.response("哈喽");
}
}
}
/**
* 抽象观察者(Observer)
*/
public interface Consumer {
void response(String message); //反应
}
/**
* 具体观察者(Concrete Observer)
*/
public class ConsumerA implements Consumer {
@Override
public void response(String message) {
System.out.println("-----ConsumerA:ProductA生产者生产了消息:"+message+"-----");
}
}
/**
* 具体观察者(Concrete Observer)
*/
public class ConsumerB implements Consumer{
@Override
public void response(String message) {
System.out.println("-----ConsumerB:ProductA生产者生产了消息:"+message+"-----");
}
}
网友评论