文章目录
适配器模式简介
适配器模式(adapter pattern)是将一个类的接口转换成客户希望的另外一个接口,使得原来由于接口不兼容而不能一起工作的,而能一起工作。
结构
- 1.目标接口(Target):当前系统所期待的接口,它可以是抽象类或者接口。
- 2.适配者类(Adaptee):它是被访问和适配的现存组件库中的组件接口。
- 3.适配器类(Adapter):转换器,通过继承或者引用适配者的对象,把适配折接口转换城目标接口,让客户目标接口的格式访问适配者。
适配器分类
适配器根据适配对象不同,分为:类适配器、接口适配器、对象适配器。
类适配器(class adapter)
类适配器中的目标对象(Target)是一个接口,被适配者类(Adaptee)需要实现或者继承目标对象接口和被适配者的类。
具体实现
例子:将220V的电压转到5V。
UML图

代码实现
- 5V电压接口(目标接口)
package com.xxliao.pattern.structure.adapter.class_adapter.demo;
/**
* @author xxliao
* @description: 5V电压接口,目标接口 - target
* @date 2024/5/24 23:56
*/
public interface IVoltage5V {
public int output5V();
}
- 220V类(适配者类)
package com.xxliao.pattern.structure.adapter.class_adapter.demo;
/**
* @author xxliao
* @description: 现存适配者类
* @date 2024/5/25 0:01
*/
public class Voltage220V {
/**
* @description 输出220V
* @author xxliao
* @date 2024/5/25 0:04
*/
public int output220V() {
System.out.println("电压="+220+"V");
return 220;
}
}
- 适配器类
package com.xxliao.pattern.structure.adapter.class_adapter.demo;
/**
* @author xxliao
* @description: 适配器类
*
* @date 2024/5/25 0:04
*/
public class Adapter extends Voltage220V implements IVoltage5V{
@Override
public int output5V() {
int src = output220V();
int dest = src / 44;
System.out.println(src+"v ==> "+dest+"V");
return dest;
}
}
- 测试客户端
package com.xxliao.pattern.structure.adapter.class_adapter.demo;
/**
* @author xxliao
* @description: 类适配器测试客户端类
* @date 2024/5/25 0:06
*/
public class Client {
public static void main(String[] args) {
Adapter adapter = new Adapter();
adapter.output5V();
}
}
- 测试结果

缺点
- 缺点:适配器类(Adapter)需要继承被适配器类(Adaptee)违背了 里氏替换原则。
接口适配器(interface adapter)
- 当不需要全部实现接口提供的方法时,可先设计一个适配器抽象类实现接口,并为该接口中每个方法提供一个默认实现(空实现),那么适配器的子类可以选择性地覆盖父类地方法。
- 使用一个接口不想使用其所有方法的情况。
具体实现
UML图

代码实现
- 测试接口
package com.xxliao.pattern.structure.adapter.interface_adapter.demo;
/**
* @author xxliao
* @description: 测试接口
* @date 2024/5/25 0:23
*/
public interface TestInterface {
public void method01();
public void method02();
public void method03();
public void method04();
}
- 适配器抽象类
package com.xxliao.pattern.structure.adapter.interface_adapter.demo;
/**
* @author xxliao
* @description: 适配器抽象类
* @date 2024/5/25 0:25
*/
public abstract class AbstractAdapter implements TestInterface{
@Override
public void method01() {
}
@Override
public void method02() {
}
@Override
public void method03() {
}
@Override
public void method04() {
}
}
- 测试客户端
package com.xxliao.pattern.structure.adapter.interface_adapter.demo;
/**
* @author xxliao
* @description: 接口适配器 测试客户端 测试类
* @date 2024/5/25 0:26
*/
public class Client {
public static void main(String[] args) {
AbstractAdapter abstractAdapter = new AbstractAdapter(){
@Override
public void method01() {
super.method01();
System.out.println("执行了method01方法..."); // 抽象适配器子类
}
};
abstractAdapter.method01();
}
}
- 测试结果:

对象适配器(object adapter)
- 因为类适配器的适配器类需要继承被适配者类违背了里斯替换原则,所以可以采用合成复用原则 ,将被适配者类当作成员变量进行组合使用。
具体实现
UML图

代码实现
- 5V接口(目标接口)
package com.xxliao.pattern.structure.adapter.object_adapter.demo;
/**
* @author xxliao
* @description: 5V接口 - 目标接口
* @date 2024/5/24 23:56
*/
public interface IVoltage5V {
public int output5V();
}
- 220V类(适配者类)
package com.xxliao.pattern.structure.adapter.object_adapter.demo;
/**
* @author xxliao
* @description: 现存适配者类
* @date 2024/5/25 0:01
*/
public class Voltage220V {
/**
* @description 输出220V
* @author xxliao
* @date 2024/5/25 0:04
*/
public int output220V() {
System.out.println("电压="+220+"V");
return 220;
}
}
- 适配器类
package com.xxliao.pattern.structure.adapter.object_adapter.demo;
import com.xxliao.pattern.structure.adapter.class_adapter.demo.Voltage220V;
/**
* @author xxliao
* @description: 适配器类
* @date 2024/5/25 0:04
*/
public class Adapter implements IVoltage5V {
private Voltage220V voltage220V;
public Adapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int output5V() {
int src = voltage220V.output220V();
int dest = src / 44;
System.out.println(src+"v ==> "+dest+"V");
return dest;
}
}
- 测试客户端
package com.xxliao.pattern.structure.adapter.object_adapter.demo;
import com.xxliao.pattern.structure.adapter.class_adapter.demo.Voltage220V;
/**
* @author xxliao
* @description: 对象适配器 测试客户端 测试类
* @date 2024/5/25 0:06
*/
public class Client {
public static void main(String[] args) {
Voltage220V voltage220V = new Voltage220V();
Adapter adapter = new Adapter(voltage220V);
adapter.output5V();
}
}
- 测试结果

1290

被折叠的 条评论
为什么被折叠?



