观察者模式
观察者(Observer)模式:是对象的行为模式,也叫做发布-订阅(Publish/Subscribe)模式。
观察者模式定义了一对多的依赖关系,即让多个观察者对象同时监听同一个主题对象,当这个主题对象的状态发生改变时,要通知所有的观察者对象,使他们能够更新自己。
结构
(1)主题:主题也叫抽象被观察者,是一个接口,该接口规定了具体主题需要实现的方法,比如,添加、删除观察者以及通知观察者更新数据的抽象方法。
(2)观察者:观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。
(3)具体主题:具体主题需使用一个集合,比如ArrayList,存放观察者的引用,以便数据变化时及时通知具体观察者。
(4)具体观察者:对具体主题通知做出改变。
实现
我和售楼处小姐姐的故事
- 被观察者接口
public interface Subject {
//订阅房价信息
public void registerObserver(Observer o);
//取消订阅
public void removeObserver(Observer o);
//通知消息
public void notifyObservers(String msg);
}
- 被观察者对象,实现被观察者接口
import java.util.ArrayList;
import java.util.List;
/**
* 售楼小姐姐
* 接受,取消,发送消息
*/
public class Sales implements Subject {
//小姐姐记录我们的信息
List<Observer> obses = new ArrayList<Observer>();
//加微信
@Override
public void registerObserver(Observer o) {
obses.add(o);
}
//拉黑
@Override
public void removeObserver(Observer o) {
if (!obses.isEmpty() && obses.contains(o)) {
obses.remove(o);
}
}
//群发消息
@Override
public void notifyObservers(String msg) {
for (Observer ob : obses) {
ob.update("售楼处小姐姐" + msg);
}
}
}
- 观察者接口
/**观察者接口**/
public interface Observer {
//更新观察者状态
public void update(String msg);
}
- 观察者对象实现update方法
//具体观察者
public class ObserverPeople implements Observer {
//用户名
private String ObservePeople;
public ObserverPeople(String name) {
this.ObservePeople = name;
}
@Override
public void update(String msg) {
System.out.println(ObservePeople + "接到" + msg);
}
}
- 测试类
package org.example.demo;
public class Test {
public static void main(String[] args) {
//创建一个售楼小姐姐
Subject sister = new Sales();
//创建三个观察者
ObserverPeople p1 = new ObserverPeople("唐三");
ObserverPeople p2 = new ObserverPeople("小三");
ObserverPeople p3 = new ObserverPeople("三少");
//加小姐姐微信
sister.registerObserver(p1);
sister.registerObserver(p2);
sister.registerObserver(p3);
//小三通知小姐姐取消订阅
sister.removeObserver(p2);
//小姐姐通知加了微信的2人
sister.notifyObservers("楼房降价了");
}
}
- 输出打印