博爱

观察者模式

# 观察者模式 #

----------

什么是观察者模式?一般提到原告,必然脑子立刻联想到被告,观察者和被观察者就如同原告和被告总是那么成对出现。观察者模式,又被叫做订阅模式,有订阅者和发布者。当下IPHONE6异常火爆,国内粉丝要想购买,那必须得预定,必须到它苹果官方去预定,填一大堆资料,交不交钱我不知道,反正得预定登记。等粉丝等到两眼欲穿、花儿快谢了时候,它粉墨登场了,官方以高姿态从容向预定过的粉丝发售。这苹果就是被观察者,粉丝就是观察者,观察者和被观察者之间需要建立联系,那就是登记。登记过后,被观察者拿捏火候觉得时机成熟的时候,就以权位者姿态向观察者抛出绣球,观察者迫不及待的伸出双手牢牢抓住后,满心欢喜的赞美苹果的伟大和自己的庆幸。睁大眼睛盯着目标看,期待期望结果,这就是观察者模式。

来段代码体验一把

----------
    import java.util.ArrayList;
    import java.util.List;
      
      
    public class MyOberver {
            public static void main(String[] args) {
                   American american=new American();
                   Chinese chinese=new Chinese();
                   Iphone iphone=new Iphone();
                   System.out.println("一个美国人登记购买");
                   iphone.register(american);
                   System.out.println("一个中国人登记购买");
                   iphone.register(chinese);
                   try {
                          System.out.println("经过6个月的漫长等待...");
                         Thread.sleep(2000);
                  } catch (InterruptedException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                  }
                   iphone.notifys();
           }
    }
    /**观察者*/
    class Iphone{
           private List<Fensi> list=new ArrayList<Fensi>();
           public void register(Fensi n){
                  list.add(n);
                  System.out.println("又一个苹果被预订了,现在总共有:"+list.size()+"个人预订了...");
           }
           public void notifys(){
                  System.out.println("IPHONE 6现在高调发售...");
                  for (Fensi n:list) {
                                n.receive();
                  }
           }
    }
    class American implements Fensi{
           @Override
           public void receive() {
                  // TODO Auto-generated method stub
                  System.out.println("美国人喊叫:嗯哼,有点贵....");
           }
    }
    class  Chinese implements Fensi{
           @Override
           public void receive() {
                  // TODO Auto-generated method stub
                  System.out.println("中国人:我终于买到了,高兴死了....");
           }
    }
    interface Fensi{
                  public void receive();
    }

----------
运行后输出结果:

一个美国人登记购买

又一个苹果被预订了,现在总共有:1个人预订了...

一个中国人登记购买

又一个苹果被预订了,现在总共有:2个人预订了...

经过6个月的漫长等待...

IPHONE 6现在高调发售...

美国人喊叫:嗯哼,有点贵....

中国人:我终于买到了,高兴死了....

 

这就是观察者模式,Chinese和American都是观察者,它们继承了Fensi接口,具有了接收消息receive的能力,Iphone是被观察者,是被观察的目标,它的一举一动,都会深深的影响Fensi们的热情,观察者需要在被观察者哪里进行登记购买register,登记过后,等到时机成熟了,被观察者会主动放出信号iphone.notifys();这样,凡是登记过购买苹果6的粉丝们,都会纷纷收到取货的信息了。

 

----------

评论