Java技术之快速了解观察者模式

  观察者模式又叫做发布-订阅模式,它根据被观察者触发的事件众多观察者执行相应的行为,前提是观察者必须向被观察者进行注册。目前流行的Spring、ZK、Mina、NIO、AWT、Swing等技术都大量使用了观察者模式。

  下图为观察者模式涉及的角色

<a href=http://www.mobiletrain.org/ target=_blank class=

Java培训.png" width="500" height="232" style="border-width: initial; border-style: none; vertical-align: top; display: inline-block;">

  孩子是一个被观察者,爸爸、妈妈、姐姐都是观察者,当被观察者触发一个事件(孩子醒来),多个观察者执行对应的行为(爸爸换尿布、妈妈喂吃的、姐姐喂水)。

  相关代码如下:

  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培训作为国内IT研发人才一体化服务的开拓者,为学生制定合理有序的学习计划,0学费入学,2周免费试听不满意不收费,与学员签订就业协议,坚持良心面授,从千锋Java培训班出去的学员均已高薪就业。千锋推出的免费java视频教程,让学员能够方面的巩固基础技术能力。

相关文章

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值