【设计模式学习-05-适配器模式】
1.概念
适配器模式
结构性模式:
作用
从程序的结构上实现松耦合, 从而可以扩大整体的类结构,用来解决更大的问题
适配器模式就像USB网线转换器
适配器模式的原理与实现
适配器模式(Adapter Design Pattern)。这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。
适配器模式有两种实现方式:类适配器和对象适配器。
类适配器使用继承关系来实现,对象适配器使用组合关系来实现。
2.Adaptee
package adapter;
//适配类:网线
public class Adaptee {
public void request(){
System.out.println("连接网线上网");
}
}
3.Adapter 类适配器
package adapter;
//继承(类适配器,单继承)
//组合(对象适配器)
public class Adapter extends Adaptee implements NetToUsb{
@Override
public void handlerRequest() {
super.request();//可以上网了
}
}
4.Adapter2 对象适配器
package adapter;
//继承(类适配器,单继承)
//组合(对象适配器)
public class Adapter2 implements NetToUsb{
private Adaptee adaptee;
public Adapter2(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void handlerRequest() {
adaptee.request();//可以上网了
}
}
5.NetToUsb
package adapter;
//接口转换器的抽象实现
public interface NetToUsb {
// 处理请求
public void handlerRequest();
}
5.Computer
package adapter;
//客户端类
public class Computer {
// 电脑需要一个转接器才可以上网
public void net(NetToUsb netToUsb){
// 上网的具体实现类,找一个转接头
netToUsb.handlerRequest();
}
public static void main(String[] args) {
//电脑,网线,适配器
Computer computer = new Computer();//电脑
Adaptee adaptee = new Adapter();//网线
Adapter adapter = new Adapter();//转接器
Adapter2 adapter2 = new Adapter2(adaptee);//转接器
computer.net(adapter);
computer.net(adapter2);
}
}
角色分析
将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作
角色分析
目标接口: 客户所期待的接口, 目标可以是具体的或抽象的类, 可以是接口
需要适配的类: 需要适配的类或适配者类
适配器: 通过包装一个需要适配的对象, 把原接口转换成目标对象
对象适配器优点
一个对象适配器可以把多个不同的适配者适配到同一个目标
可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据"里氏代换原则", 适配者的子类也可通过该适配器进行适配
类适配器缺点
对于Java, C#等不支持多重类继承的语言, 一次最多只能适配一个适配者类,不能同时适配多个适配者,
在Java, C#等语言中, 类适配器模式中的目标抽象类只能为接口, 不能为类, 其使用有一定的局限性
适用场景
系统需要使用一些现有的类, 而这些类的接口(如方法名)不符合系统的需求,甚至没有这些类的源代码
想创建一个可以重复使用的类, 用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作