适配器模式(Adapter Pattern)又称作变压器模式
,是指将一个类的接口变成客户端所期望的另一种接口,从而是原本因接口不匹配二导致无法在以下工作的两个类能够一起工作,属于结构型设计模式。
适配器模式主要解决的是功能兼容问题。
适配器字面意思就是使得一个东西能适合另一个东西的东西。
(1)模式的结构
主要角色如下:
(2)适配器模式有3种形式
类适配器:
原理就是通过继承来实现适配器的功能。Adapter实现 ITarget接口并继承 Adaptee。对象适配器:
原理就是通过组合来实现适配器的功能。Adapter实现 ITarget接口,然后内部持有 Adaptee实例,最后在 ITarget接口中规定的方法内转换 Adaptee。接口适配器:
适用于当目标接口的方法过多时,如果直接实现接口,则类会多出许多空实现的方法,显得很臃肿。所以,使用接口适配器就能只实现我们需要的接口方法,是目标更清晰。优点:
缺点:
事后控制不如事中控制,事中控制不如事前控制。
有时,只有碰到无法改变原有设计和代码的情况时,才会考虑适配器模式。以电源适配器来实例,我们民用电是 220V交流电,但是手机等电子产品使用的是 5V/12V等的直流电。所以充电时,需要适应电源适配器来进行转换。
代码如下:
public class ClassAdapterPattern {
public static void main(String[] args) {
PowerAdapter powerAdapter = new PowerAdapter();
int outputAC220V = powerAdapter.outputAC220V();
System.out.println(outputAC220V);
System.out.println("------------");
int output5V = powerAdapter.output5V();
System.out.println(output5V);
}
}
// 目标角色
interface DC5 {
int output5V();
}
// 源角色
class AC220 {
public int outputAC220V() {
int output = 220;
System.out.println("输出电压=" + output + "V");
return output;
}
}
// 适配器
class PowerAdapter extends AC220 implements DC5{
@Override
public int output5V() {
int adapterInput = super.outputAC220V();
int adapterOutput = adapterInput / 44;
System.out.println("使用 Adapter输入AC=" + adapterInput + "V,输出 DC=" + adapterOutput + "V");
return adapterOutput;
}
}
代码如下:
public class ObjectAdapterPattern {
public static void main(String[] args) {
PowerAdapter powerAdapter = new PowerAdapter(new AC220());
int output5V = powerAdapter.output5V();
System.out.println(output5V);
}
}
// 目标角色
interface DC5 {
int output5V();
}
// 源角色
class AC220 {
public int outputAC220V() {
int output = 220;
System.out.println("输出电压=" + output + "V");
return output;
}
}
// 适配器
class PowerAdapter implements DC5{
private AC220 ac220;
public PowerAdapter(AC220 ac220) {
this.ac220 = ac220;
}
@Override
public int output5V() {
int adapterInput = ac220.outputAC220V();
int adapterOutput = adapterInput / 44;
System.out.println("使用 Adapter输入AC=" + adapterInput + "V,输出 DC=" + adapterOutput + "V");
return adapterOutput;
}
}
代码如下:
public class InterfaceAdapterPattern {
public static void main(String[] args) {
PowerAdapter powerAdapter = new PowerAdapter(new AC220());
int output5V = powerAdapter.output5V();
System.out.println(output5V);
System.out.println("---------------");
int output12V = powerAdapter.output12V();
System.out.println(output12V);
}
}
// 目标角色
interface DC {
int output5V();
int output12V();
int output24V();
}
// 源角色
class AC220 {
public int outputAC220V() {
int output = 220;
System.out.println("输出电压=" + output + "V");
return output;
}
}
// 适配器
class PowerAdapter implements DC{
private AC220 ac220;
public PowerAdapter(AC220 ac220) {
this.ac220 = ac220;
}
@Override
public int output5V() {
int adapterInput = ac220.outputAC220V();
int adapterOutput = adapterInput / 44;
System.out.println("使用 Adapter输入AC=" + adapterInput + "V,输出 DC=" + adapterOutput + "V");
return adapterOutput;
}
@Override
public int output12V() {
int adapterInput = ac220.outputAC220V();
int adapterOutput = adapterInput / 18;
System.out.println("使用 Adapter输入AC=" + adapterInput + "V,输出 DC=" + adapterOutput + "V");
return adapterOutput;
}
@Override
public int output24V() {
return 0;
}
}
– 求知若饥,虚心若愚。