观察者模式又叫做发布-订阅模式,它根据被观察者触发的事件众多观察者执行相应的行为,前提是观察者必须向被观察者进行注册。目前流行的Spring、ZK、Mina、NIO、AWT、Swing等技术都大量使用了观察者模式。
下图为观察者模式涉及的角色
孩子是一个被观察者,爸爸、妈妈、姐姐都是观察者,当被观察者触发一个事件(孩子醒来),多个观察者执行对应的行为(爸爸换尿布、妈妈喂吃的、姐姐喂水)。
相关代码如下:
packagecom.caojie.day38.observer;
/**
* @author caojie
* 观察者 爸爸 妈妈
*/
public interfaceAbstractObserver {
/**
* 被观察者触发一个事件观察者执行一系列行为
*/
publicvoid action();
}
packagecom.caojie.day38.observer;
/**
* @author caojie
* 抽象被观察者(孩子)
*/
public interfaceAbstractObserverable {
/**
* 被观察者有一个注册的方法,将多个观察者注入到里面
* @param observer
*/
publicvoid register(AbstractObserver observer);
/**
* 被观察者通知观察者执行
* 例如:小孩子醒来会触发此事件
*/
publicvoid noticeEvent();
}
packagecom.caojie.day38.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author caojie
* 小孩子是一个具体被观察者
*/
public class BabyObserverableimplements AbstractObserverable{
/**
* 被观察者有一个容器专门存储注册的观察者
*/
privateList<AbstractObserver> list = new ArrayList<>();
/**
* 被观察者调用此方法将观察者注入到容器
*/
@Override
publicvoid register(AbstractObserver observer) {
list.add(observer);
}
/**
* 当被观察者触发此事件,观察者执行对应的行为
* 例如:小孩子醒来,爸爸妈妈姐姐执行一些列行为
*/
@Override
publicvoid noticeEvent() {
for(AbstractObserveroberver: list){
oberver.action();
}
}
}
packagecom.caojie.day38.observer;
import org.apache.log4j.Logger;
public class Father implementsAbstractObserver {
/**
* Logger for this class
*/
privatestatic final Logger logger = Logger.getLogger(Sister.class);
@Override
publicvoid action() {
Stringmsg ="小孩子醒来,爸爸为它换尿布";
if(logger.isInfoEnabled()) {
logger.info("action()- String msg=" + msg);
}
}
}
packagecom.caojie.day38.observer;
import org.apache.log4j.Logger;
public class Mather implementsAbstractObserver {
/**
* Logger for this class
*/
privatestatic final Logger logger = Logger.getLogger(Sister.class);
@Override
publicvoid action() {
Stringmsg ="小孩子醒来,妈妈为他倒水";
if(logger.isInfoEnabled()) {
logger.info("action()- String msg=" + msg);
}
}
}
packagecom.caojie.day38.observer;
import org.apache.log4j.Logger;
public class Sister implementsAbstractObserver {
/**
* Logger for this class
*/
privatestatic final Logger logger = Logger.getLogger(Sister.class);
@Override
publicvoid action() {
Stringmsg ="小孩子醒来,姐姐为他擦汗";
if(logger.isInfoEnabled()) {
logger.info("action()- String msg=" + msg);
}
}
}
packagecom.caojie.day38.observer;
public class Test {
publicstatic void main(String[] args) {
AbstractObserverableobserverable = new BabyObserverable();
AbstractObserverfather = new Father();
AbstractObservermather = new Mather();
AbstractObserversister = new Sister();
//将观察者注入到被观察者中
observerable.register(father);
observerable.register(mather);
observerable.register(sister);
//小孩子触发一个事件,爸爸妈妈姐姐执行对应的行为
observerable.noticeEvent();
}
}