文章目录
介绍
描述
观察者模式设计模式属于行为型模式,即当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,介于对象之间多对一依赖的一种设计方案。
特点
-
优点:观察者和被观察者是抽象耦合的,通过集合的方式来管理。
-
缺点:观察者较多时候都通知到会花费很多时间。
实现原理
Subject:就是定义相关观察者的增删改操作,“被观察”的角色需要继承实现其具体操作,同时把所有观察者对象的引用保存在一个集合中。
Observer:是抽象的“观察”角色,它定义了一个更新接口,使得在被观察者状态发生改变时可以进行通知。
ConcreteObserver:具体的观察者。
适用
-
多对一依赖的场景,依赖对象(观察者对象)都将得到通知,进行广播通知。
-
链式触发场景。
观察者模式
实现
实现订阅报纸事件。
第一步:创建一个接口Subject,并实现增、删及通知操作,另一个抽象观察者Observer。
// 接口主题,被观察者 只需要继承即可
public interface Subject {
//增加一个观察者
void addObserver(Observer observer);
//删除一个观察者
void deleteObserver(Observer observer);
//通知所有观察者
void notifyObserver();
}
// 抽象观察者
public interface Observer {
//更新
public void update(String name,String date);
}
第二步:创建具体被观察者Newspaper,实现接口Subject,管理所属的所有观察者对象。
public class Newspaper implements Subject{
private String name;
private String date;
private Vector<Observer> observers = new Vector<>();
public Newspaper(String name, String date) {
this.name = name;
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
@Override
public void addObserver(Observer o) {
observers.add(o);
}
@Override
public void deleteObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObserver() {
for (Observer o:observers){
// 更新
o.update(name,date);
}
}
}
第三步:创建对应的具体观察者。
// 观察者1号
public class PeopleOneObserver implements Observer{
@Override
public void update(String name,String date) {
System.out.println("第一个人 订阅 : " + name + " 最新时间: " + date);
}
}
// 观察者2号
public class PeopleSecObserver implements Observer{
@Override
public void update(String name,String date) {
System.out.println("第二个人 订阅 : " + name + " 最新时间: " + date);
}
}
第四步:测试。
public class Test {
public static void main(String[] args) {
// 创建一个报纸
Newspaper newspaper = new Newspaper("报纸—1","2020-5-25");
// 创建 观察者
PeopleOneObserver p1 = new PeopleOneObserver();
PeopleSecObserver p2 = new PeopleSecObserver();
// 观察
newspaper.addObserver(p1);
newspaper.addObserver(p2);
// 通知
newspaper.notifyObserver();
/*
第一个人 订阅 : 报纸—1 最新时间: 2020-5-25
第二个人 订阅 : 报纸—1 最新时间: 2020-5-25
*/
}
}