适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
案例:
- 定义机器接口和其具体实现的两个不同机器
/**
* @author Gjing
* 刷卡器
**/
public interface CardMachine {
/**
* 刷身份证
*/
void blushIdCard(String number);
/**
* 刷银行卡
*/
void blushBankCard(String number);
}
/**
* 身份证刷卡器
*/
class IdCardMachine implements CardMachine{
@Override
public void blushIdCard(String number) {
System.out.println("身份证刷卡器执行刷卡,卡号:" + number);
}
@Override
public void blushBankCard(String number) {
}
}
/**
* 银行卡刷卡器
*/
class BankCardMachine implements CardMachine {
@Override
public void blushIdCard(String number) {
}
@Override
public void blushBankCard(String number) {
System.out.println("银行卡刷卡器执行刷卡,卡号:" + number);
}
}
- 定义机器类型枚举
/**
* @author Gjing
* 定义机器类型
**/
public enum MachineType {
/**
* 刷卡器类型
*/
ID_CARD,BANK_CARD;
}
- 定义高级机器、处理器、外部插入口
/**
* @author Gjing
* 高级机器
**/
public interface SuperMachine {
/**
* 刷卡
*/
void blush(MachineType machineType, String number);
}
/**
* 高级机器内部处理器
*/
class SuperMachineAdapter implements SuperMachine {
@Override
public void blush(MachineType machineType, String number) {
switch (machineType) {
case ID_CARD:
CardMachine cardMachine = new IdCardMachine();
cardMachine.blushIdCard(number);
break;
case BANK_CARD:
cardMachine = new BankCardMachine();
cardMachine.blushBankCard(number);
break;
default:
throw new NullPointerException("没有找到合适机器");
}
}
}
/**
* 高级机器提供给外部的刷卡口
*/
class SuperMachineOut implements SuperMachine {
@Override
public void blush(MachineType machineType, String number) {
SuperMachineAdapter machineAdapter = new SuperMachineAdapter();
machineAdapter.blush(machineType, number);
}
}
- 调用
/**
* @author Gjing
**/
public class Test {
public static void main(String[] args) {
SuperMachine superMachine = new SuperMachineOut();
superMachine.blush(MachineType.ID_CARD, TimeUtil.localDateTimeToStamp(LocalDateTime.now())+"");
superMachine.blush(MachineType.BANK_CARD, TimeUtil.localDateTimeToStamp(LocalDateTime.now())+"");
}
}
应用场景:
适配器模式就是把一个类的接口转换成客户端所期待的另外一种接口,从而使原接口不匹配而无法在一起工作的的两个类能在一起工作。从功能上说,这些接口不兼容的类一般具有相同或相似的功能。通常我们通过修改该类的接口来解决这种接口不兼容的情形,但是如果我们不愿意为了一个应用而修改各原接口,或者我们压根儿就没有对象的源代码的时候,适配器模式就会派上用场了。
优点:
1、将目标类和适配者类解耦
2、增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性.
3、灵活性和扩展性都非常好,符合开闭原则
缺点:
过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
注意:
适配器不是在详细设计时添加的,而是解决正在运行的项目的问题。
以上为个人见解,如有误欢迎各位指正