12-1 适配器模式讲解
12-2 适配器模式coding
有一个被适配器类:
public class Adaptee {
public void adapteeRequest() {
System.out.println("被适配者的方法");
}
}
这个是目标方法的接口:
public interface Target {
void request();
}
这个是目标方法的实现:
/** 具体的实现类 */
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget目标方法");
}
}
而这个就是适配类:继承于被适配类,实现目标方法的接口:
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
我们来进行测试一下:
public class Test {
public static void main(String[]args){
Target target = new ConcreteTarget();
target.request();
/** 现在,我们就来通过适配器类来进行实现 */
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
测试结果如下:
ConcreteTarget目标方法
被适配者的方法
这个时候,我们调用适配类里面的方法,然后转到被适配类里面的方法:
以上的就是类适配器模式;
现在的类图为:
现在,我们来说说对象适配器模式:
同上面一样:有一个目标接口
public interface Target {
void request();
}
还有一个具体的目标类:
/** 具体的实现类 */
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget目标方法");
}
}
以及被适配的类:
public class Adaptee {
public void adapteeRequest() {
System.out.println("被适配者的方法");
}
}
适配类和上面的有一些不同,这里被适配类不是继承过来的,而是作为属性组合到里面来,然后通过对象来调用被适配类里面的方法:
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.adapteeRequest();
}
}
现在,我们来测试一下:我们在拷贝的时候,一定要注意包是否引对
public class Test {
public static void main(String[]args){
Target target = new ConcreteTarget();
target.request();
/** 现在,我们就来通过适配器类来进行实现 */
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
执行结果:和上面的类适配器模式的执行结果一样
ConcreteTarget目标方法
被适配者的方法
这个就是现在的类图:
在继承和组合的时候,我们优先使用组合;
我们再类引入一个生活场景:手机充电器的适配器,将220V的交流电转换成5V的直流电:
首先有一个被适配的类:220V的类
public class AC220 {
public int outputAC220V() {
int output = 220;
System.out.println("输出220V的交流电"+output+"V");
return output;
}
}
我们有一个目标方法的接口:转为5V的直流电
public interface DC5 {
int outputDC5V();
}
这个就是适配类:
public class PowerAdapter implements DC5 {
private AC220 ac220 = new AC220();
@Override
public int outputDC5V() {
int adapterInput = ac220.outputAC220V();
/** 变压器 */
int adapterOutput = adapterInput / 44;
System.out.println("通过PowerAdapter电源适配器输入AC"+adapterInput+"V"+"输出DC:"+adapterOutput+"V");
return adapterOutput;
}
}
public class Test {
public static void main(String[]args){
DC5 dc5 = new PowerAdapter();
dc5.outputDC5V();
}
}
执行结果:
输出220V的交流电220V
通过PowerAdapter电源适配器输入AC220V输出DC:5V
12-3 适配器模式源码解析(jdk+spring+springjpa+springmvc)
- XmlAdapter
- AdvisorAdapter
- 在JPA里面也大量的使用到适配器模式
- HandlerAdapter