适配器模式

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

这两个类会将字节流对象适配为字符流对象。


results matching ""

    No results matching ""