一、基本概念
适配器模式中的“适配器”一词来源于我们生活中的电源适配器,比如说,通俗的来讲就是将你的电器(例如手机),和我们的插座上的插孔相连接,就需要适配器(也就是手机充电器)来连接。电源适配器就相当于一个桥梁,使得两个不兼容的物体连接在了一起。
回到我们软件开发中,适配器模式的意义就是将一个类的接口变换成客户所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。
二、适配器模式的UML图
首先我们有两个很重要的类,第一个是Adapter,他就是适配器,第二个是Adaptee,就是被适配的那个类,当我们客户需要去访问原有类的功能时,我们可以无缝的访问适配器类,在适配二的时候有两种方式,第一种称为关联使用,关联使用就是把适配的对象放到适配器内,通过访问适配器的方法间接调用被访问的对象,第二种方法通过继承,成为子类,通过访问子类间接访问原有类。
三、代码演示
package com.deu.patterns;
import javafx.scene.shape.Circle;
//适配器类将220v电压转换为110v电压
public class Adapter extends Adaptee implements Target
{
@Override
public int Output_110v()
{
int a= Output_220V();
return a/2;
}
}
//被适配对象这里是220v电源
class Adaptee{
public int Output_220V()
{
System.out.println("电源电压为220v");
return 220;
}
}
//目标是输出110v电压
interface Target
{
int Output_110v();
}
//手机实体类
class Phone
{
public void Connect(Adapter adapter)
{
if(adapter.Output_110v()==110)
{
System.out.println("电压适配为110v,可以正常充电。");
}
else
{
System.out.println("电压不适配,不能正常充电。");
}
}
}
//在主函数中创建Phone对象,调用Connect()方法,传入一个新建的适配器
class Test {
public static void main(String[] args) {
Phone phone = new Phone();
phone.Connect(new Adapter());
}
}
四、和装饰者模式的区别
意图不同:适配器模式的主要意图是将一个已有的类的接口转换成客户所期望的另一个接口,以满足不同的需求。而装饰器模式的主要意图则是为对象动态地添加新的行为或责任。
对象类型不同:适配器模式通常使用组合方式来包装被适配者对象,从而对它进行转换;而装饰器模式则是包装同种类型的对象,使其能够动态地增加新的行为或责任。适用场景不同:适配器模式适用于需要在保持原有接口、功能和实现的同时,通过对现有对象的适应来扩展新的功能。例如,将一种数据格式转换成另一种格式。
而装饰器模式适用于在不改变对象接口的情况下为对象动态地添加新的职责或行为。例如,为文本编辑器增加拼写检查、撤销操作等。