结构型模式-适配器模式
什么是适配器?
在应用程序中,我们可能需要让两个不同接口的类来进行通信,在不修改这两个的前提下我们可能会需要某个中间件来完成这个衔接的过程。这个中间件就是适配器;
适配器的定义:
? 将一个类的接口转换成客户期望的另一个接口,适配器(Adapter)让原本接口不兼容的类可以相互合作
实际案例
? 现在市面上的笔记本电脑越来越薄,很多电脑就去掉了传统的那种网线接口,是插不了网线的。要插网线就需要通过USB网线转化器来实现,这里就有一些适配器的思想体现了
USB网线转换器:一端连接电脑,另一端连接网线
角色分析
目标接口: 客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。(这里的电脑接口)
需要适配的类: 需要适配的类或适配者类。(网线)
适配器: 通过包装一个需要适配的对象,把原接口转换成目标对象!(USB网线转换器)
代码实现适配器模式
创建三个类:网线,适配器,电脑
创建一个接口:USB接口(转换器)
1.创建网线抽象类
package com.gun.java23mvc.factory.adapter;
public class Reticle {
public void request(){
System.out.println("成功连接上了网线");
}
}
2.创建USB接口
package com.gun.java23mvc.factory.adapter;
public interface NetToUsb {
public void handleRequest();
}
3.创建真正的适配器(通过继承的方式)
package com.gun.java23mvc.factory.adapter;
public class Adapter extends Reticle implements NetToUsb{
@Override
public void handleRequest() {
System.out.println("通过继承Reticle:成功连接USB转接口");
super.request();
}
}
适配通过组合的方式实现
package com.gun.java23mvc.factory.adapter;
public class Adapter2 implements NetToUsb{
private Reticle reticle;
public void setReticle(Reticle reticle) {
this.reticle = reticle;
}
@Override
public void handleRequest() {
System.out.println("通过组合:成功连接USB转接口");
reticle.request();
}
}
4.创建电脑类
package com.gun.java23mvc.factory.adapter;
public class Computer {
public void net(NetToUsb adapter){
adapter.handleRequest();
}
}
5.创建客户类测试
package com.gun.java23mvc.factory.adapter;
public class TestClient {
public static void main(String[] args) {
Computer computer = new Computer();
Reticle reticle = new Reticle();
Adapter adapter = new Adapter();
Adapter2 adapter2 = new Adapter2();
adapter2.setReticle(reticle);
computer.net(adapter);
System.out.println("****************************************************");
computer.net(adapter2);
}
}
输出结果:
通过继承Reticle:成功连接USB转接口
成功连接上了网线
****************************************************
通过组合:成功连接USB转接口
成功连接上了网线
案例画图总结
Computer(电脑)类 和 Reticle(网线)类没有任何关系,通过适配器将它们联系起来,从而实现了电脑上网
适配器的优点
- 一个对象适配器可以把多个不同的适配者适配到同一个目标
- 可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据
“里氏代换原则” ,适配者 的子类也可通过该适配器进行适配。
适配器的缺点
- 对于ava、C#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者;
- 在ava、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。
应用场景
- 系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源
代码。 - 想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引
持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者; - 在ava、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。
|