技术分享:观察者模式

                          

         观察者模式又叫做发布-订阅模式,它根据被观察者触发的事件众多观察者执行相应的行为,前提是观察者必须向被观察者进行注册。目前流行的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();

   }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值