free_2013

导航

观察者模式的学习和理解

模拟一个孩子在睡觉,父亲子在孩子醒来后给孩子喂奶

没学观察者模式之前的实现一:

//利用线程隔一段时间去看下孩子醒来了没:耗内存资源

public class BanBen1 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Child c=new Child();
  Dad d=new Dad(c);
        new Thread(c).start();
        new Thread(d).start();
  
 }

}

class Child implements Runnable{
 
 private static boolean isweak=false;

 public  static boolean isIsweak() {
  return isweak;
 }

 public  static void weakUp() {
  isweak = true;
 }

 @Override
 public void run() {
  // TODO Auto-generated method stub
  try {
   Thread.sleep(3000);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  this.weakUp();
 }
 
}

class Dad implements Runnable{

 Child c;
 
 public Dad(Child c){
  
  this.c=c;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  while(!c.isIsweak()){
   try {
    Thread.sleep(2000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  
  System.out.println("喂孩子吃奶");
 }
 
}

 

没学观察者模式之前的实现二:

//孩子醒来后主动调用了父亲的喂孩子方法,功能实现了,但是不合理,而且不利于扩展

public class BanBen2 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

  Dad2 d=new Dad2();
  new Thread(new Child2(d)).start();
 }
 
}
class Child2 implements Runnable{
 Dad2 d;
 public Child2(Dad2 d) {
  // TODO Auto-generated constructor stub
  this.d=d;
  d.setC(this);
 }
 
 private void weakUp(){
        
  d.weihaizi();
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  try {
   Thread.sleep(3000);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  weakUp();
 }
}
class Dad2{

 Child2 c;
 public Child2 getC() {
  return c;
 }
 public void setC(Child2 c) {
  this.c = c;
 }
 public void weihaizi() {
  // TODO Auto-generated method stub
  System.out.println("喂孩子孩子吃奶");
 }
 

 

学习了观察者模式后的实现

//效率高,便于扩展,一个被监听者可以被不同类型的监听器监听,也可以被同一类型的多个监听器监听,

同一类型的监听器可以监听同一事件的不同的被监听者

mport java.util.ArrayList;
import java.util.List;

public class BanBen3 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

  WeakupListener listen1=new WeakupListener() {
   
   @Override
   public void WeakupAction(WeakupEvent cwe) {
    // TODO Auto-generated method stub
    System.out.println("listener1 excute weakupAction");
   }
  };
  
        WeakupListener listen2=new WeakupListener() {
   
   @Override
   public void WeakupAction(WeakupEvent cwe) {
    // TODO Auto-generated method stub
    System.out.println("listener2 excute weakupAction");
   }
  };
  Sleeper sleeper=new Sleeper();
  sleeper.addWeakupListener(listen1);
  sleeper.addWeakupListener(listen2);
  new Thread(sleeper).start();
 }

}
interface WeakupListener{
 void WeakupAction(WeakupEvent cwe);
}

class WeakupEvent{
 long weakTime;
}

class Sleeper implements Runnable{

 WeakupEvent event;
 List<WeakupListener> listners=new ArrayList<WeakupListener>();
 void addWeakupListener(WeakupListener wl){
  listners.add(wl);
 }
 
 void getWeakupEvent(WeakupEvent we){
  event=we;
  wekup();
 }
 
 void wekup(){
  for (WeakupListener wl : listners) {
   wl.WeakupAction(event);
  }
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  try {
   Thread.sleep(2000);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  getWeakupEvent(event);
 }
 
 
}

 

posted on 2013-07-25 00:52  free_2013  阅读(218)  评论(0)    收藏  举报