适配器模式
微信公众号:新时代程序猿
关注可了解更多的JAVA,PYTHON,ANDROID教程及开发技术。
问题或建议,请公众号留言;
如果你觉得文章对你有帮助,欢迎赞赏
什么是适配器模式
适配器模式是一种结构型设计模式, 它将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
这个模式可以通过创建适配器进行接口转换,让不兼容的接口变得兼容。这可以让客户从实现的接口解耦。如果在一段时间之后,我们想要改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着修改。
我们举个例子。有两部手机,一个Android,一个ios,如果我们出门在外只带了一个Android充电线,那是无法直接使用的,因为ios的充电线和Android的不同,所以,我们需要一个适配器。
- 图片
适配器模式组成结构
- 客户 (Client):客户类。
- 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
- 适配者(Adaptee):需要适配的类或适配者类。
- 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
(1)“对象”适配器
-图片
适配器模式 UML 图解
这个适配器模式充满着良好的 OO 设计原则:使用对象组合,以修改的接口包装备被适配者;这样做还有一个优点:那就是被适配者的任何子类,都可以搭配着适配器使用。
(2)“类”适配器
看起来“类”适配器和“对象”适配器很类似,唯一的差别就是 Adapter 继承了 Target 与 Adaptee。所以“类”适配器必须要使用多重继承才能实现,在 Java 中这是不可能的。所以这里我们主要介绍“对象”适配器。
适配器模式应用场景
系统需要使用现有的类,而这些类的接口不符合系统的需要。
想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
需要一个统一的输出接口,而输入端的类型不可预知。
适配器模式具体应用
问题描述
有两部手机,一个Android,一个ios,如果我们出门在外只带了一个Android充电线,那是无法直接使用的,因为ios的充电线和Android的不同。需要一个适配器来给ios充电。
代码实现 (“对象”适配器模式)
1.Android数据线:
public class AndroidLine implements phoneCharge{
@Override
public void startCharge(Phone androidPhone) {
androidPhone.name = "Android";
androidPhone.startChargeAction();
}
}
Android的数据线只能给Android手机充电,所以这里我们直接把name写死为“Android”。
2.目标角色:给ios手机充电
public interface AbsIosPhone {
void startIosCharge(Phone phone);
}
3.数据线转换器
public class IosLineAdapter implements AbsIosPhone{
AndroidLine androidLine;
public IosLineAdapter(AndroidLine androidLine) {
this.androidLine = androidLine;
}
@Override
public void startIosCharge(Phone phone) {
phone.setName("IOS");
androidLine.startCharge(phone);
}
}
这里创建两个手机对象:
public abstract class Phone {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
abstract void startChargeAction();
}
public class AndroidPhone extends Phone{
@Override
void startChargeAction() {
name = "Android";
System.out.println(name + "手机开始充电");
}
}
public class IosPhone extends Phone{
@Override
void startChargeAction() {
name = "IOS";
System.out.println(name +"手机开始充电");
}
}
测试:
public class client {
public static void main(String[] args) {
//Android 数据线
AndroidLine androidLine = new AndroidLine();
androidLine.startCharge(new AndroidPhone());
//IOS 充电转接头(适配器)
IosLineAdapter iosLineAdapter = new IosLineAdapter(new AndroidLine());
iosLineAdapter.startIosCharge(new IosPhone());
}
}
输出:
Android 手机开始充电
IOS 手机开始充电
适配器模式优点
(1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无需修改原有代码。
(2)增加了类的透明性和复用性,将具体地实现封装在了适配器类中,对客户端来说是透明的,并且提高了适配者地复用性。
(3)客户端面向抽象层编程,可以使用配置文件,方便地更换适配器,也可以在不修改代码的基础上,引入新的适配器,之后只需要将配置文件改为新适配器即可。灵活性和可扩展性非常好。
适配器缺点
(1)如果客户端面向的抽象层是抽象类而不是接口,那么由于只能使用对象适配器,如果适配者方法不能完全满足要求,那么代码量可能较大。
(2)随意引入适配者类,可能会导致系统中类的关联关系混乱,不利于代码的维护。
评论区