案例:手机,手机的Type-C接口,圆孔耳机,转接头
适配者类 adaptee:手机的Type-C接口
public class TypeC {
public TypeC(){
System.out.println("转接头已通过Type-C连接手机");
}
}
目标接口 target:圆孔耳机
public interface Earphone {
void connectEarphone();
}
适配器 adapter:转接头
public class Adapter extends TypeC implements Earphone{
@Override
public void connectEarphone() {
System.out.println("转接头已连接耳机");
}
}
手机
public class Phone {
public void listenMusicWithoutEarphone(){
System.out.println("外放音乐");
}
public void listenMusicWhitEarphone(Adapter adapter){
System.out.println("带上耳机听音乐");
}
}
测试方法
public class Test {
public static void main(String[] args) {
Phone phone = new Phone();//创建一个手机
phone.listenMusicWithoutEarphone();//外放音乐
System.out.println("=================");
Adapter adapter = new Adapter();//创建一个转接头(转接头已自动连接手机)
adapter.connectEarphone();//转接头连接耳机
phone.listenMusicWhitEarphone(adapter);
}
}
输出结果
类适配器模式违背了合成复用原则。因为Java的单继承性,所以类适配器模式只适用于客户类有一个接口规范的情况下,反之不可用。
与上述案例中,只有适配器类有区别
public class Adapter implements Earphone {
private TypeC typeC;
public Adapter(TypeC typeC){
this.typeC = typeC;
}
@Override
public void connectEarphone() { System.out.println("转接头已连接耳机"); }
}
测试方法
public class Test {
public static void main(String[] args) {
Phone phone = new Phone();
phone.listenMusicWithoutEarphone();
System.out.println("==================");
Adapter adapter = new Adapter(new TypeC());
adapter.connectEarphone();
phone.listenMusicWhitEarphone(adapter);
}
}
输出结果
当不需要全部实现接口提供的方法时,这时我们可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有的方法都进行置空,那么我们再创建抽象类的继承类,而且重写我们需要使用的那几个方法即可。(如多头充电器)
target接口
public interface Cable {
//安卓充电线
void android();
//苹果充电线
void apple();
//Type-C充电线
void typeC();
}
adapter抽象适配器
public abstract class Adapter implements Cable {
@Override
public void android() {
}
@Override
public void apple() {
}
@Override
public void typeC() {
}
}
AndroidAdapter继承抽象适配器
public class AndroidAdapter extends Adapter {
private Current220V current220V;
public AndroidAdapter(Current220V current220V){
this.current220V = current220V;
}
@Override
public void android() {
System.out.println("安卓充电线线");
}
}
测试方法
public class Test {
public static void main(String[] args) {
Current220V current220V = new Current220V();
AndroidAdapter adapter = new AndroidAdapter(current220V);
adapter.android();
}
}
装饰器模式 | 适配器模式 | |
---|---|---|
形式 | 有层级关系,是一种非常特别的适配器模式 | 没有层级关系 |
定义 | 装饰器和被装饰器实现同一个接口,为了扩展之后保留OOP关系 | 适配器和被适配者没有必然的联系,通常是采用继承或代理的形式进行包装 |
功能 | 注重覆盖 | 注重兼容、转换 |
设计 | 前置考虑 | 后置考虑 |