观察者模式
什么叫做观察者模式:
举个例子吧,以前读书的时候上课玩游戏,聊天,撩妹的是不是担心班主任来巡查,这时候是不是会叫一个人去观察班主任来没来?这里的上课开小差的是被通知的人,看班主任来没来的是观察者,同时他需要负责通知开小差的人。班主任是被观察的人。这就是一个很典型的观察者模式。
何时使用:
当一个对象的改变对其他多个对象有影响的话,就可以考虑使用。
注意:
1.避免观察者和观察目标之间循环引用导致系统崩溃
2.如果顺序执行,某一观察者错误或者超时会导致系统卡壳,一般采用异步方式
代码示例:
/**
* 班主任
*/
public class Teacher {
public void check() {
System.out.println("老师来巡查");
}
}
/**
* 观察者接口
*/
public interface ObserverInterface {
void update();
}
这里有一个 ArrayList 存放被通知者们。
/**
* 张三观察者
*/
public class ZhangsanObserver implements ObserverInterface {
//存放通知的同学
private List<Inform> informs = new ArrayList<>();
/**
* 通知
*/
@Override
public void update() {
System.out.println("张三看到老师来了");
for (Inform inform : informs) {
inform.receive();
}
}
public void addInforms (Inform inform) {
informs.add(inform);
}
public void removeInforms (Inform inform) {
informs.remove(inform);
}
}
/**
* 通知接口
*/
public interface Inform {
void receive();
};
public class LisiInform implements Inform {
@Override
public void receive() {
System.out.println("李四收到消息,手机收起来");
}
}
public class WangwuInform implements Inform {
@Override
public void receive() {
System.out.println("王五收到消息,不和同桌唠嗑了");
}
}
public class main {
public static void main(String[] args) {
System.out.println("张三开始放哨");
Teacher teacher = new Teacher();
try {
teacher.check();
Thread.sleep(5000);
LisiInform lisiInform = new LisiInform();
WangwuInform wangwuInform = new WangwuInform();
ZhangsanObserver zhangsanObserver = new ZhangsanObserver();
zhangsanObserver.addInforms(lisiInform);
zhangsanObserver.addInforms(wangwuInform);
zhangsanObserver.update();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
结果: