下面是正文
目的
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配无法工作的两个类能够一起工作。
生活中的例子
TypeC转3.5mm耳机插孔,TypeC手机充电口转MicroUsb充电接口。
主要作用
将两个不匹配无法工作的接口通过Adapter接口,使得两个接口可以一起工作。
表现形式
对象适配模式、类适配模式、缺省适配模式(接口适配模式)
实例
这里以Type手机的接口使用带有3.5mm的耳机为例:
3.5mm耳机接口
/**
* Jack3_5 接口
*
* 表示 3.5毫米的耳机插孔
* */
public interface Jack3_5 {
void use3_5playMusic();
}
typec接口
/**
* TypeC接口
*
* 表示typec插孔的手机
* */
public interface TypeCJack {
//播放音乐
void useTypeCPlayMusic();
//充电
void charge();
}
3.5mm插孔耳机
/**
* 这是一个实体类,表示一个3.5mm插孔的耳机实体
* */
public class Jack_35mm implements Jack3_5{
@Override
public void use3_5playMusic() {
System.out.println("正在播放出优美的音乐。。。。。。");
}
}
对象适配器
/**
* 这是一个对象适配器类
*
* 将typec接口 转接为 3.5mm的接口
* */
public class ObjectAdapter implements TypeCJack{
private Jack_35mm jack_35mm;
public ObjectAdapter(Jack_35mm jack_35mm){
this.jack_35mm = jack_35mm;
}
@Override
public void useTypeCPlayMusic() {
jack_35mm.use3_5playMusic();
}
}
类适配器
/**
* 这是一个类适配器类
*
* 将typec接口 转接为 3.5mm的接口
* */
public class ClassAdapter extends Jack_35mm implements TypeCJack{
@Override
public void useTypeCPlayMusic() {
use3_5playMusic();
}
}
测试
/**
* Java适配器模式 事例代码
*
* 这是Adapter模式的入口类
*
* 现在要实现的是将Typec接口的耳机插孔通过3.5mm的耳机放出音乐
*
* 这里就需要一个转接线,将typec接口转接为3.5mm的接口,然后3.5mm的耳机就可以正常使用了
* */
public class AdapterMain {
public static void main(String[] args){
//对象适配器
Jack_35mm jack_35mm = new Jack_35mm();
ObjectAdaptee objectAdapter = new ObjectAdaptee(jack_35mm);
objectAdaptee.useTypeCPlayMusic();
//类适配模式
ClassAdaptee classAdapter = new ClassAdapter();
classAdapter.useTypeCPlayMusic();
}
}
输出结果
对象适配模式和类适配模式不同
1、对象适配模式通过组合关系实现,可以对子类适配
类适配模式通过继承关系实现,无法对子类进行适配
缺省适配模式
为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,不必再从原接口进行扩展。
TypeC接口不仅能实现插耳机播放音乐,也能实现通过数据线进行充电。使用同一个接口不能同时进行充电和播放音乐,所以我们现在使用缺省适配模式对其充电方法进行适配,而不需要从原接口适配。
/**
* 这是缺省适配模式
* 使用抽象类实现TypeC接口的充电功能
* 当需要使用充电功能的时候,只需要实现这个抽象类
* 而不必实现原有的TypeC接口
* */
public abstract class InterfaceAdapter implements TypeCJack {
@Override
public void useTypeCPlayMusic() {
}
@Override
public void charge() {
}
}
/**
* 实现充电操作
* 只需要继承缺省实现的适配器
* 而不需要实现原有接口
* */
class ChargeOperat extends InterfaceAdapter {
@Override
public void charge() {
System.out.println("正在进行充电操作。。。。。。");
}
}
注意事项
适配器模式不应该在项目设计之初使用,是为了解决老项目与新功能之间相匹配使用的。
[Java]
设计模式源码