今天Java培训机构小编就来和大家一起学习一下java中的观察者模式,首先我先来了解一下,观察者模式又叫做发布-订阅模式,它根据被观察者触发的事件众多观察者执行相应的行为,但前提是观察者必须向被观察者进行注册。现在常用的spring,swing等技术都大量的使用了观察者模式,所以我们非常有必要去熟悉观察者。
下面小编就以比喻的模式为大家讲解观察者模式,婴儿是一个被观察者,爸爸、妈妈、姐姐都是观察者,当被观察者触发一个事件(婴儿醒来),多个观察者执行对应的行为(爸爸换尿布、妈妈喂吃的、姐姐喂水)。
好了废话不多说,正菜来了上代码:
package com.caojie.day38.observer;
/**
* @author caojie
* 观察者 爸爸 妈妈
*/
public interface AbstractObserver {
/**
* 被观察者触发一个事件观察者执行一系列行为
*/
public void action();
}
package com.caojie.day38.observer;
/**
* @author caojie
* 抽象被观察者(孩子)
*/
public interface AbstractObserverable {
/**
* 被观察者有一个注册的方法,将多个观察者注入到里面
* @param observer
*/
public void register(AbstractObserver observer);
/**
* 被观察者通知观察者执行
* 例如:婴儿醒来会触发此事件
*/
public void noticeEvent();
}
package com.caojie.day38.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author caojie
* 婴儿是一个具体被观察者
*/
public class BabyObserverable implements AbstractObserverable{
/**
* 被观察者有一个容器专门存储注册的观察者
*/
private List list = new ArrayList<>();
/**
* 被观察者调用此方法将观察者注入到容器
*/
@Override
public void register(AbstractObserver observer) {
list.add(observer);
}
/**
* 当被观察者触发此事件,观察者执行对应的行为
* 例如:婴儿醒来,爸爸妈妈姐姐执行一些列行为
*/
@Override
public void noticeEvent() {
for(AbstractObserver oberver: list){
oberver.action();
}
}
}
package com.caojie.day38.observer;
import org.apache.log4j.Logger;
public class Father implements AbstractObserver {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(Sister.class);
@Override
public void action() {
String msg ="婴儿醒来,爸爸为它换尿布";
if (logger.isInfoEnabled()) {
logger.info("action() - String msg=" + msg);
}
}
}
package com.caojie.day38.observer;
import org.apache.log4j.Logger;
public class Mather implements AbstractObserver {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(Sister.class);
@Override
public void action() {
String msg ="婴儿醒来,妈妈为他倒水";
if (logger.isInfoEnabled()) {
logger.info("action() - String msg=" + msg);
}
}
}
package com.caojie.day38.observer;
import org.apache.log4j.Logger;
public class Sister implements AbstractObserver {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(Sister.class);
@Override
public void action() {
String msg ="婴儿醒来,姐姐为他擦汗";
if (logger.isInfoEnabled()) {
logger.info("action() - String msg=" + msg);
}
}
}
package com.caojie.day38.observer;
public class Test {
public static void main(String[] args) {
AbstractObserverable observerable = new BabyObserverable();
AbstractObserver father = new Father();
AbstractObserver mather = new Mather();
AbstractObserver sister = new Sister();
//将观察者注入到被观察者中
observerable.register(father);
observerable.register(mather);
observerable.register(sister);
//婴儿触发一个事件,爸爸妈妈姐姐执行对应的行为
observerable.noticeEvent();
}
}
思途教育专注于Java培训,从0基础开始学起,项目经理手把手教学,签订就业协议,保障学员就业,8年时间20余位行业项目经理共同研发欧洲案例教学的IT培训理念,培训过程中贯穿百余个商业项目,让学员在4-6月的培训时间内获得1-2年的项目开发经验。为企业不断输送“有效人才”。思途的服务理念是让高薪就业更简单!