观察者模式,又称监听者模式。主要是用于当对某一事件的发生时,通知关注事件发生的成员。
如下:
/**
* 孩子 -被观察者
* */
public class Child {
//间谍
private Spy spy;
//植入间谍,使得孩子被监视
public void setSpy(Spy spy) {
this.spy = spy;
}
// true - 醒着 false - 睡着
private boolean state = true;
//睡觉
public void sleep(){
if(state ==true) state = false;
}
//苏醒
public void wakeup(){
if(state ==false) {
state = true;
cry();
}
}
public void cry(){
System.out.println("开始哭......");
spy.notifyObservers();
}
}
/**
* 间谍,负责植入被观察者,并向观察者发通知
* */
public class Spy {
//容器,一个被观察者允许有多个观察者
ArrayList<Observer> observers;
public Spy(ArrayList<Observer> observers){
this.observers = observers;
}
//添加观察者
public void addObservers(Observer observer){
observers.add(observer);
}
//删除观察者
public void deleteObservers(Observer observer){
observers.remove(observer);
}
//向所有的观察者发通知
public void notifyObservers(){
for(Observer observer:observers){
observer.excute();
}
}
}
/**
* 观察者
* */
public interface Observer {
//观察者收到消息后的处理,也可以选择不处理
public void excute();
}
/**
* 父亲,观察者
* */
public class Father implements Observer{
@Override
public void excute() {
System.out.println("换尿布");
}
}
/**
* 母亲,观察者
* */
public class Mather implements Observer{
@Override
public void excute() {
System.out.println("奶孩子");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
Father father = new Father();
Mather mather = new Mather();
//创建间谍,并把父亲,母亲作为观察者加进去
ArrayList<Observer> observers = new ArrayList<Observer>();
observers.add(father);
observers.add(mather);
Spy spy = new Spy(observers);
//将间谍注入到孩子中去
child.setSpy(spy);
child.sleep();
child.wakeup();
}
}
运行结果:
开始哭......
换尿布
奶孩子