适配器模式
Posted zpkang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器模式相关的知识,希望对你有一定的参考价值。
适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
例如: InputStreamReader(InputStream);
可以将字节流转为字符流, 这里就用到了适配器模式
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
角色分析
- 目标接口: 客户所期待的接口, 目标可以是具体的或抽象类, 也可以是接口
- 需要适配的类: 需要适配的类或适配的类
- 适配器: 通过包装一个需要适配的对象, 把原接口转化成目标对象
案例
思考
如果我们有一台老电脑, 没有网线插槽, 只有USB的插槽, 这时候我们就需要使用一个网线适配器来让电脑可以使用网线上网
现在我们就用代码来模拟一下这个适配器
代码
Adaptee
类: 要被适配的类->网线
public class Adaptee {
// 上网
public void request() {
System.out.println("连接网线上网");
}
}
NetToUsb
类: 接口转换器的抽象实现
public interface NetToUsb {
// 作用: 处理请求, 网线=>USB
public void handleRquest();
}
Adapter
类: 真正的适配器, 需要连接USB, 连接网线
public class Adapter implements NetToUsb {
// 组合网线
private Adaptee adaptee;
// 构造器
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
// 使用适配器连接网络
@Override
public void handleRquest( ) {
adaptee.request(); // 可以上网了
}
}
Computer
类: 电脑类->想上网, 插不上网线
public class Computer {
// 我们的电脑需要连接上转接器才可以上网
public void net(NetToUsb adapter) {
// 上网的具体实现, 找一个转接头
adapter.handleRquest();;
}
}
main
方法实现
public static void main(String[] args) {
Computer computer = new Computer(); // 电脑
Adaptee adaptee = new Adaptee(); // 网线
Adapter2 adapter = new Adapter2(adaptee); // 转接器
computer.net(adapter);
}
输出结果:
连接网线上网
代码结构图:
优缺点
优点
- 一个对象适配器可以把多个不同的适配者适配到同一个目标
- 可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏代换原则”,适配者的子类也可通过该适配器进行适配。
缺点
- 对于Java、C#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者;
- 在Java、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性
适用场景
- 系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码。
- 想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
以上是关于适配器模式的主要内容,如果未能解决你的问题,请参考以下文章