适配器模式
1. 使用场景
用在两套系统结合时,当两套系统中的接口不匹配,需要通过适配器类来进行协调。
2. 实现举例
1) spring cache
spring要整合第三方的缓存时,spring自身有一套Cache接口:
package org.springframework.cache;
public interface Cache {
...
}
spring的这套Cache的接口,是为了整合其它的缓存,例如ehcache,guava cache等,它自己并不真正提供缓存操作。
ehcache 的缓存操作接口为:
package net.sf.ehcache;
public interface Ehcache extends Cloneable {
...
}
guava 的缓存操作接口为:
package com.google.common.cache;
public interface Cache<K, V> {
...
}
spring的Cache接口与这两套的接口定义不同,方法声明有差异。这时候就需要提供多个适配器类来实现spring的cache接口,在这个适配器类中再间接调用第三方的缓存接口,以起到适配的作用。
对ehache 接口的适配:
public class EhCacheCache implements Cache {
private final Ehcache cache;
// 例如清空缓存操作,spring 的Cache接口方法为clear(),而Ehcache接口中为removeAll()
@Override
public void clear() {
this.cache.removeAll();
}
...
}
对guava 接口的适配:
// 其中AbstractValueAdaptingCache实现了spring的Cache接口
public class GuavaCache extends AbstractValueAdaptingCache {
private final com.google.common.cache.Cache<Object, Object> cache;
// 例如清空缓存操作,spring 的Cache接口方法为clear(),而guava的Cache接口中为invalidateAll()
@Override
public void clear() {
this.cache.invalidateAll();
}
...
}
2) InputStreamReader OutputStreamWriter
这两个类会将字节流对象适配为字符流对象。