适配器模式:
在日常生活中,会经常遇到一些适配器,例如笔记本电脑的变压器,究竟是电影的电源适配器。
比如说:电脑笔记本电脑只接受15V的电压,因此不能和直接220V的电源插座连接,电源适配器能够把220V的电压转换为15v,它是链接笔记本电脑何普通电源的桥梁。
在面向对象的领域,也采用适配器模式来进行接口的转换
适配器模式有两种方式:
1 继承实现方式
SourceFC 和 targetFC 分别代表源接口和目标接口,在SourceFC 接口只有add(int a,int b) 方法。而目标接口中有add(int a,int b) 和addONE(int a) 方法。
public class SourceImpl implements SourceFC {
public int add(int a ,int b) {
return a+ b;
}
}
public class TargetIMpl extends SourceImpl implements TargetFC {
public int addONE (Int a) {
return add(a,1);
}
}
(2) 组合实现方式
public class TargetImpl implements TargetFC {
private SourceFC source;
public TargetImpl(SourceFC source) {
this.source = source ;
}
public int add(int a,int b) {
return source.add(a,b);
}
public int addOne(int a) {
return source.add(a,1);
}
}
hibernate 提供了连接池的实现类DriverManagerConnectionProvider,这是hibernate默认的数据库连接池,此外hibernate还可以使用第三方提供的专业的数据库链接池产品,如C3P0链接池软件和DBCP连接池软件。但是这些第三方的连接池软件都有个字的API,他们并没有实现HIBERNATE指定的COnectionProvider接口。
例如DBCP连接池的API包括:
org.apache.commons.pool.KeyedObjectPoolFactory接口
org.apache.commons.pool.ObjectPool 接口
hibernate只会访问ConnectionProvider接口,这个接口有3个实现类,其中DBCPConnectionProvider和C3POConnectionProvider类是适配器,他们分别负责把DBCP和C3PO链接池转换为ConnectionProvider接口,这两个适配器都采用组合实现方式。
单例模式 键值的缓存方案
每一次进行键值的查询,有必要吗? 毕竟一个键的值只是一些序列号码,与其每接到一次请求就查询一次,
然后向客户端提供一个值,不如在一次查询中一次性地预先等级多个键值,然后连续多次的向客户端提供这些预定的键值。
这样一来 不是就节省了大部分不必要的数据库查询操作吗?
public class KeyGenerator {
private static KeyGenerator keygen =
new KeyGenerator();
private static final int POOL_SIZE = 20 ;
private KeyInfo key;
/**
私有构造,保证外界无法直接实例化
*/
private KeyGenerator() {
key = new KeyInfo(POOL_SIZE);
}
public static KeyGenerator getInstance() {
return keygen;
}
public synchronized int getNextKey() {
return key.getNextKey();
}
}
public KeyInfo {
private int keyMax ;
private int keyMin ;
private int nextKey;
private int poolSize;
public KeyInfo(int poolSize) {
this.poolSize = poolSize ;
retrieveFromDB();
}
public int getKeyMax() {
return keyMax;
}
public int getNextKey() {
if(nextKey > keyMax) {
retrieveFromDB();
}
}
}