文章目录
二、适配器模式
1. 定义
- 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
2. 包含的角色
- 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成 目标接口,让客户按目标接口的格式访问适配者。
3. 分类
3.1 类适配器模式(耦合度较高,用的少)
-
缺点
:类适配器模式违背了合成复用原则 -
注意
:类适配器是客户类有一个接口规范的情况下可用,反之不可用。 -
举例:苹果手机用带多功能转接头的数据线进行充电
-
UML:

3.1.1 代码
- iphoneInterface
/**
* iPhone充电口
*/
public interface iphoneInterface {
public String startCharge();
public void endCharge(String msg);
}
- iphoneInterfaceImpl
/**
* iPhone充电口 实现类
*/
public class iphoneInterfaceImpl implements iphoneInterface{
@Override
public String startCharge() {
String str = "开始充电";
return str;
}
@Override
public void endCharge(String msg) {
System.out.println(msg+"->结束充电");
}
}
- chargeInterface
/** * 多功能数据线的不同型手机接口 */public interface chargerInterface { public String startCharge(); public void endCharge(String msg);}
- chargeInterfaceImpl
/** * 多功能数据线的不同型手机接口 实现类 */public class chargetInterfaceImpl implements chargerInterface{ @Override public String startCharge() { String str = "开始插上手机,进行充电"; return str; } @Override public void endCharge(String msg) { System.out.println(msg+"->结束充电,拔下数据线"); }}
- dateBigport
/** * 数据线的多个接口选择其中一个充电,就选择苹果接口 */public class dateBigport extends iphoneInterfaceImpl implements chargerInterface{ @Override public String startCharge() { System.out.println("通过多功能接口插的"); String str = "连接苹果手机"; return str; } @Override public void endCharge(String msg) { System.out.println(msg+"拔下苹果手机"); }}
- charger
/** * 充电器大头 */public class charger { public String charge(chargerInterface ci){ if(ci==null){ throw new NullPointerException("没连接手机吧?"); } return ci.startCharge(); }}
- 测试类
public class Client { public static void main(String[] args) { charger ch = new charger(); System.out.println(ch.charge(new chargetInterfaceImpl())); String msg1 = ch.charge(new dateBigport()); System.out.println(msg1); }}
- 测试结果
====插上数据线,先插上,不管你有没有插上苹果手机,只有先插上苹果手机才能充电=====开始插上数据线,准备充电====插上数据线,先插上,不管你有没有插上苹果手机,只有先插上苹果手机才能充电==========通过转接口进行充电====通过多功能接口插的连接苹果手机=====通过转接口进行充电====
3.2 对象适配器模式
- UML

3.2.1 代码
- dateBigport
/** * 数据线的多个接口选择其中一个充电,就选择苹果接口 */public class dateBigport implements chargerInterface {//修改后的代码 private iphoneInterface iphoneii; public dateBigport(iphoneInterface iphoneii) { this.iphoneii = iphoneii; }//修改后的代码 @Override public String startCharge() { System.out.println("通过多功能接口插的"); String str = "连接苹果手机"; return str; } @Override public void endCharge(String msg) { System.out.println(msg + "拔下苹果手机"); }}
- 测试类
public class Client {
public static void main(String[] args) {
System.out.println("====插上数据线,先插上,不管你有没有插上苹果手机,只有先插上苹果手机才能充电=====");
charger ch = new charger();
System.out.println(ch.charge(new chargetInterfaceImpl()));
System.out.println("====插上数据线,先插上,不管你有没有插上苹果手机,只有先插上苹果手机才能充电=====");
System.out.println();
System.out.println("=====通过转接口进行充电====");
dateBigport db = new dateBigport(new iphoneInterfaceImpl());
String msg1 = ch.charge(db);
System.out.println(msg1);
System.out.println("=====通过转接口进行充电====");
}
}
3.3 应用场景
- 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
- 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。