观察者模式是一种类似广播的设计模式,通常用于多个对象需要接收同一个消息时使用,里面会包含两个类型的成员。第一个是观察者:观察或这订阅某个消息。第二个是被观察者:用于发布消息。
/**
* @创建者 lucas
* @创建时间 2018/3/16 0016 16:56
* @描述 观察者模式
*/
//观察者抽象类--假设是网虫学生
interface Observer {
//通知回调
void notify(String msg);
}
//创建一个被观察者--假设是宿舍舍长,他是开黑组织者
class Subscriber {
private static Subscriber instance = new Subscriber();
//开黑报名的学生
private List<Observer> mObserverList = new ArrayList<>();
public static Subscriber getInstance() {
return instance;
}
//报名入口
public void register(Observer observer){
if (!mObserverList.contains(observer))
mObserverList.add(observer);
}
//怕挨打,我要退出组织
public void unregister(Observer observer){
if (mObserverList.contains(observer))
mObserverList.remove(observer);
}
//放学了
public void classesOver(){
//舍长:我得赶紧通知同学去网吧抢位置
for (Observer observer : mObserverList) {
observer.notify("放学了,腿快则有,腿慢则无,跑的快的帮我也占个位置^_^");
}
}
}
class AStudent implements Observer {
//最后一节课了,我得向舍长报个名
void sign(){
Subscriber.getInstance().register(this);
}
@Override
public void notify(String msg) {
Log.d("AStudent", "收到消息,冲啊");
}
}
class BStudent implements Observer {
//最后一节课了,我得向舍长报个名
void sign(){
Subscriber.getInstance().register(this);
}
@Override
public void notify(String msg) {
Log.d("AStudent", "收到消息,冲啊");
}
}
public class ObserverMode {
void test(){
//同学甲
AStudent aStudent = new AStudent();
BStudent bStudent = new BStudent();
//报名
aStudent.sign();
bStudent.sign();
//放学了
Subscriber.getInstance().classesOver();
}
}