适配器模式:
在日常生活中,会经常遇到一些适配器,例如笔记本电脑的变压器,究竟是电影的电源适配器。
比如说:电脑笔记本电脑只接受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(); } } }