简单理解适配器模式
很多智能机都会有一个内存卡卡槽用来扩展内存,有时候我们想从电脑往内存卡里面拉点电影以便出门途中用来打发时间,但电脑不能直接插内存卡,这时候就用到了读卡器,读卡器就是今天要说的适配器。
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
使用场景
- 系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码。
- 想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
结构
- Traget(目标抽象类)
- Adapter(适配器类)
- Adaptee(适配者类)
- Client(客户类)
实现代码
Target:USB(USB接口)
Adaptee:MemoryCard(内存卡)
Adapter:CardReader(读卡器):
Client:Client(电脑)
类适配器
Target
public interface USB {
void handleReq();
}
Adaptee
public class MemoryCard {
public void doSomething(){
System.out.println("开始处理数据...");
}
}
Adapter
public class CardReader extends MemoryCard implements USB {
@Override
public void handleReq() {
super.doSomething();
}
}
Client
public class Client {
public static void main(String[] args) {
// 使用读卡器处理数据
CardReader cardReader = new CardReader();
cardReader.handleReq();
}
}
对象适配器
Target
public interface USB {
void handleReq();
}
Adaptee
public class MemoryCard {
public void doSomething(){
System.out.println("开始处理数据...");
}
}
Adapter
public class CardReader implements USB {
private MemoryCard memoryCard;
public CardReader(MemoryCard memoryCard) {
this.memoryCard = memoryCard;
}
@Override
public void handleReq() {
memoryCard.doSomething();
}
}
Client
public class Client {
public static void main(String[] args) {
CardReader cardReader = new CardReader(new MemoryCard());
cardReader.handleReq();
}
}
区别
- 类适配器:对象继承的方式,静态的定义。
- 对象适配器:依赖于对象的组合,都是采用对象组合的方式,也就是对象适配器实现的方式。
适配器模式的优缺点
优点
- 可以让任何两个没有关联的类一起运行
- 提高了类的复用,想使用现有的类,而此类的接口标准又不符合现有系统的需要。通过适配器模式就可以让这些功能得到更好的复用。
- 增加了类的透明度,客户端只关注结果
- 使用适配器的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
缺点
- 过多使用会导致系统凌乱,追溯困难(内部转发导致,调用A适配成B)