定义:讲一个类的接口转换成客户期望的另一个接口
结构型
应用场景
- 已存在的类与需求不匹配(但是结果相同或者类似)
- 不是软件设计阶段需要考虑的设计模式,而是随着软件的维护,不同的厂商、不同的产品造成了类似而接口不同的一种解决方案
优点
- 提高类的复用性,且现有的代码不需要修改。
- 目标类与被适配的类解耦。
- 符合开闭原则
缺点
- 增加了代码的复杂度
替代方案扩展知识
源码应用的场景
- AdvisorAdapter
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
@Override
public boolean supportsAdvice(Advice advice) {
return (advice instanceof MethodBeforeAdvice);
}
@Override
public MethodInterceptor getInterceptor(Advisor advisor) {
MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
return new MethodBeforeAdviceInterceptor(advice);
}
}
demo
UML
目录结构
EnumerationAdapter 将Enumeration适配成Iterator接口类型
package structual.adapter;
import java.util.Enumeration;
import java.util.Iterator;
public class EnumerationAdapter<E> implements Iterator<E>{
Enumeration<E> enumeration;
public EnumerationAdapter(Enumeration<E> enumeration) {
this.enumeration = enumeration;
}
@Override
public boolean hasNext() {
return enumeration.hasMoreElements();
}
@Override
public E next() {
return enumeration.nextElement();
}
}
EnumerationAdapterTest 测试类
package structual.adapter;
import org.junit.Test;
import java.util.*;
public class EnumerationAdapterTest {
@Test
public void enumerationAapterTest(){
Hashtable<String, String> hashtable = new Hashtable<>();
hashtable.put("first","1");
hashtable.put("secend","2");
Set<Map.Entry<String, String>> entries = hashtable.entrySet();
Enumeration<String> elements = hashtable.elements();
Iterator<String> enumerationAdapter = new EnumerationAdapter(elements);
for (;enumerationAdapter.hasNext();){
System.out.println(enumerationAdapter.next());
}
}
}