观察者设计模式
适用场景: 当一个条件成立的时候 我需要 同时通知所有的订阅者
1. 定义一个观察者接口
public interface Observer {
//通知有数据更新的方法
void update(String str);
}
- 设计两个地方观察者实现这个观察者接口
/**
* 北京观察者
*/
public class BeijingObserver implements Observer {
@Override
public void update(String str) {
System.out.println("北京获取到通知的消息:"+str);
}
}
/**
* 成都观察者
*/
public class CdOberver implements Observer{
@Override
public void update(String str) {
System.out.println("成都获取到通知的消息:"+str);
}
}
3. 地方观察者要注册进来的接口(管理地方观察者)
public interface Subject {
//添加的方法
void add(Observer observer);
//删除的方法
void delete(Observer observer);
}
4. 实现管理地方观察者的类也可叫注册中心,只有注册进来才能收到消息
public class TotalTemplate implements Subject {
//观察者都注册到里面来
private List<Observer> observers = new ArrayList<>();
/**
* 添加地方观察者的方法
* @param observer
*/
@Override
public void add(Observer observer) {
if (!(observers.contains(observer))) {
observers.add(observer);
}
}
/**
* 删除地方观察者的方法
* @param observer
*/
@Override
public void delete(Observer observer) {
if (observers.contains(observer)) {
observers.remove(observer);
}
}
/**
* 通知注册进来的地方观察者
*/
public void update(){
for (int i = 0; i <observers.size() ; i++) {
observers.get(i).update("注意注意、有台风来袭....");
}
}
}
5.测试
public class TestMain {
public static void main(String[] args) {
//获取地方观察者的注册中心
TotalTemplate totalTemplate = new TotalTemplate();
//地方观察者成都
CdOberver cdOberver = new CdOberver();
//地方观察者北京
BeijingObserver beijingObserver = new BeijingObserver();
//将两个观察者注册进去
totalTemplate.add(cdOberver);
totalTemplate.add(beijingObserver);
//可以删除一个地方观察者成都
totalTemplate.delete(cdOberver);
//向注册了的地方观察者通知数据
totalTemplate.update();
}
}