单例模式结合观察者模式
来源:优易学  2011-12-24 15:17:43   【优易学:中国教育考试门户网】   资料下载   IT书店
 起因:多线程对数据库写操作

  办法:让多线程先把数据写到一个公共的arraylist中,等这个list足够大的时候,单开一个线程进行写操作。

  方案:

  首先,将这个arraylist使用单例模式思想,这样就可以让多线程都用它,并且写一起。

  然后,用观察者观察这个arraylist的长度,如果到了指定长度,就进行写操作,同时清空这个arraylist,方便多线程们继续使用。

  结果,实现了!!

  -----

  感谢对此方案提出过宝贵意见的 姜同学,小强同学,大师同学~~~hoho~~排名不分先后~~O(∩_∩)O哈哈~

  demo: 让一个循环让单例的arraylist写数字...每当arraylist长度到5的时候,打印arraylist,并且置空。

  代码如下:

  Singleton.java    单例的类

  Java代码

  package testArray;

  import java.util.ArrayList;

  import java.util.Observable;

  public class Singleton extends Observable{

  private ArrayList<String> arrayList=new ArrayList<String>();

  private static Singleton singleton=null;

  /**

  * 避免被继承

  */

  private Singleton(){

  }

  /**

  * 产生单例

  * @return

  */

  public static Singleton getInstance(){

  if(singleton==null){

  singleton=new Singleton();

  }

  return singleton;

  }

  /**

  * 只要能置空arraylist就行.

  */

  public static void clearInstance(){

  singleton.arrayList.clear();

  }

  public  void putElement(String str){

  arrayList.add(str);

  if(arrayList.size()>5){

  setChanged();  //触发观察者模式

  notifyObservers(arrayList);

  }

  }

  }

  DataOperation.java  操作类

  Java代码

  package testArray;

  import java.util.ArrayList;

  import java.util.Observable;

  import java.util.Observer;

  public class DataOperation implements Observer {

  private ArrayList<String> arrayList=null;

  public void update(Observable o, Object arg) {

  if(arg instanceof ArrayList){

  arrayList=(ArrayList)arg;

  for(String s : arrayList){

  System.out.println(s);

  }

  System.out.println("*********************************");

  Singleton.clearInstance();//想在这里让那个单例的list置空

  }

  }

  }

  测试类 Test.java

  Java代码

  package testArray;

  public class Test {

  /**

  * @param args

  */

  public static void main(String[] args) {

  Singleton singleton=Singleton.getInstance();

  singleton.addObserver(new DataOperation());

  int i=0;

  while(i<12){

  singleton.putElement(i+":ele");

  i++;

  }

  }

  }

  结果:

  Java代码

  0:ele

  1:ele

  2:ele

  3:ele

  4:ele

  5:ele

  *********************************

  6:ele

  7:ele

  8:ele

  9:ele

  10:ele

  11:ele

  *********************************

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训