定义:
多个对象间存在 一对多的 依赖关系,对象状态发生变化时,所有依赖于它的 对象收到通知,并自动更新;
也叫:发布订阅模式
优缺点
优点:
- 降低了对象间的耦合度,属于抽象耦合关系- 依赖倒转
- 目标和观察者之间,会建立触发机制
缺点:
- 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
- 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。(可以异步)
主要组成结构
抽象目标(抽象主题)
具体目标(具体主题)
抽象观察者
具体观察者
应用实例
订阅-发布
读者订阅某个博主,博主发布文章,读者就会收到
消息队列… …
类图
代码实现
/**
* 读者 订阅 博主
* 博主发新文章,推送给 读者
*/
abstract class Blogger{
List<Reader> readerList = new ArrayList<>();
void addReader(Reader reader){
System.out.println(reader.toString()+"订阅了博主");
readerList.add(reader);
}
void removeReader(Reader reader){
System.out.println(reader.toString()+"退订了博主");
readerList.remove(reader);
}
/**
* 写文章
*/
abstract void write();
}
class Ming extends Blogger{
/**
* 写文章
*/
@Override
void write() {
System.out.println("博主写了新文章");
readerList.forEach(Reader::read);
}
}
interface Reader{
void read();
}
class ReaderA implements Reader{
@Override
public void read() {
System.out.println("ReaderA 收到了博主的新文章");
}
}
class ReaderB implements Reader{
@Override
public void read() {
System.out.println("ReaderB 收到了博主的新文章");
}
}
/**
* 观察者模式
*
* @author yufw
*/
public class ObserverPattern {
public static void main(String[] args) {
Reader readerA = new ReaderA();
Reader readerB = new ReaderB();
Blogger blogger = new Ming();
blogger.addReader(readerA);
blogger.addReader(readerB);
blogger.write();
}
}
结果
com.beauty.designpatterns.behavior.ReaderA@58372a00订阅了博主
com.beauty.designpatterns.behavior.ReaderB@4dd8dc3订阅了博主
博主写了新文章
ReaderA 收到了博主的新文章
ReaderB 收到了博主的新文章