单例模式结合观察者模式

起因:多线程对数据库写操作
办法:让多线程先把数据写到一个公共的arraylist中,等这个list足够大的时候,单开一个线程进行写操作。
方案:
首先,将这个arraylist使用单例模式思想,这样就可以让多线程都用它,并且写一起。
然后,用观察者观察这个arraylist的长度,如果到了指定长度,就进行写操作,同时清空这个arraylist,方便多线程们继续使用。
结果,实现了!!


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

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

代码如下:
Singleton.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 操作类

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

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++;
}


}

}



结果:

0:ele
1:ele
2:ele
3:ele
4:ele
5:ele
*********************************
6:ele
7:ele
8:ele
9:ele
10:ele
11:ele
*********************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值