苏州策划网站模板建站公司,成全视频免费观看在线看第7季动漫,wordpress文章类模板下载,dedecms网站如何上线适配器模式#xff08;Adapter Pattern#xff09;#xff0c;又称作变压器模式#xff08;因为这两者都体现了“转换”或“适配”的核心概念#xff09;#xff0c;是一种结构型设计模式。它将一个类的接口转换成客户端所期望的另一种接口#xff0c;从而使得原本因接口…适配器模式Adapter Pattern又称作变压器模式因为这两者都体现了“转换”或“适配”的核心概念是一种结构型设计模式。它将一个类的接口转换成客户端所期望的另一种接口从而使得原本因接口不匹配而无法协同工作的两个类能够一起工作。
一、工作原理
适配器模式的工作原理是通过创建一个适配器类该类包含一个源接口和一个目标接口。适配器类将客户端请求转换为源接口可以理解的命令并执行相应的操作。这样客户端只需要与适配器交互而不需要直接与源接口交互从而实现了接口的转换和适配。
二、主要角色
目标接口Target定义客户端使用的接口也就是客户端期望的接口。适配器Adapter实现目标接口并持有一个源接口的引用用于将客户端的请求转换成对源接口的调用。源接口Adaptee需要被适配的接口即系统中已经存在的、但接口与目标接口不兼容的类。客户端Client使用目标接口来调用适配器的方法从而间接调用源接口的方法。
三、实现方式
适配器模式有两种主要的实现方式对象适配器和类适配器。 对象适配器 符合组合复用原则使用了委托机制。在适配器类中维护一个被适配者源接口的成员变量通过该成员变量调用被适配者的方法。 类适配器 通过类的继承关系实现适配器模式。适配器类继承被适配者类通过super关键字调用被适配者的方法。
注在实际开发中推荐使用对象适配器模式因为组合通常比继承更加灵活且更符合开闭原则。
四、适用场景
功能正确但接口不匹配对于之前开发好的类其操作和返回值都是正确的但其定义的方法接口无法调用。此时可以使用适配器模式使该类与用户的接口匹配让用户使用适配器的接口间接调用该类。软件维护阶段在软件维护时出现操作和返回值类似但函数接口不同的情况为了适配第三方系统的接口可以使用适配器模式。多个类的接口统一当系统中的多个类的接口不统一时可以使用适配器模式将它们的接口统一成一个接口使这些类能够协同工作提高系统的灵活性和可扩展性。
五、优缺点 优点 提高代码的复用性和灵活性通过适配器模式可以让原本不兼容的接口协同工作。降低耦合目标类和现有类被适配者解除耦合降低了系统的耦合性易于扩展和维护。符合开闭原则如果需要修改或扩展功能只需要修改适配器类即可目标类和现有类各自独立互不影响。 缺点 增加代码的复杂度和维护成本适配器模式需要增加一个额外的适配器类增加了代码的量。如果设计不当可能会导致适配器类的滥用增加代码的混乱程度。降低可读性系统代码可读性可能会降低因为调用系统接口时如果调用的是适配器接口还需要查找调用的是哪个现有类的实际接口。
六、代码示例
示例一电压适配器
假设我们有一个输出220V电压的设备Voltage220V类但我们有一个只能接受5V电压的设备如手机Phone类。此时我们可以使用适配器模式来创建一个电压适配器VoltageAdapter类。
// 被适配类表示输出220V电压的设备
public class Voltage220V {public int output220V() {int src 220;System.out.println(电压 src 伏);return src;}
}// 适配接口表示需要适配到的5V电压接口
public interface IVoltage5V {int output5V();
}// 适配器类将220V电压适配为5V电压
public class VoltageAdapter implements IVoltage5V {private Voltage220V voltage220V;public VoltageAdapter(Voltage220V voltage220V) {this.voltage220V voltage220V;}Overridepublic int output5V() {int srcV voltage220V.output220V(); // 获取220V电压int dstV srcV / 44; // 转换为5V电压这里仅为示例实际转换可能更复杂return dstV;}
}// 客户端类表示只能接受5V电压的设备如手机
public class Phone {// 充电方法接受5V电压接口public void charging(IVoltage5V iVoltage5V) {if (iVoltage5V.output5V() 5) {System.out.println(电压为5v可以充电);} else if (iVoltage5V.output5V() 5) {System.out.println(电压大于5v无法充电);}}
}// 客户端测试代码
public class Client {public static void main(String[] args) {Phone phone new Phone();Voltage220V voltage220V new Voltage220V();VoltageAdapter voltageAdapter new VoltageAdapter(voltage220V);phone.charging(voltageAdapter); // 通过适配器为手机充电}
}
在这个示例中VoltageAdapter类作为适配器将Voltage220V类的220V电压输出转换为5V电压输出从而满足了Phone类的充电需求。
示例二三相插座与两相插座的适配器
假设我们有一个三相插座ThreeElectricOutlet接口和一个两相插座TwoElectricOutlet接口以及一个只能插入两相插座的电视机Tv类。此时我们可以使用适配器模式来创建一个三相到两相的插座适配器TreeElecricAdapter类。
// 三相插座接口
public interface ThreeElectricOutlet {void connectElectricCurrent();
}// 两相插座接口
public interface TwoElectricOutlet {void connectElectricCurrent();
}// 电视机类实现了两相插座接口
public class Tv implements TwoElectricOutlet {private String name;public Tv() {name 电视机;}public Tv(String name) {this.name name;}Overridepublic void connectElectricCurrent() {System.out.println(name 开始播放节目);}
}// 三相到两相的插座适配器
public class TreeElecricAdapter implements ThreeElectricOutlet {TwoElectricOutlet outlet;public TreeElecricAdapter(TwoElectricOutlet teo) {this.outlet teo;}Overridepublic void connectElectricCurrent() {outlet.connectElectricCurrent();}
}// 客户端测试代码
public class TestActivity {public static void main(String[] args) {ThreeElectricOutlet outlet;Tv tv new Tv(长虹电视机);TreeElecricAdapter adapter new TreeElecricAdapter(tv);outlet adapter;outlet.connectElectricCurrent(); // 通过适配器为电视机供电}
}
题外适配器模式为什么又被称为变压器模式
适配器模式Adapter Pattern之所以又被称为变压器模式是因为这两者都体现了“转换”或“适配”的核心概念。以下是对这一命名由来的详细解释
1、功能上的相似性 适配器模式 主要解决的是接口不匹配的问题。通过适配器类将一个类的接口转换成客户端所期望的另一种接口从而使得原本因接口不匹配而不能一起工作的两个类能够一起工作。 变压器 在电力系统中变压器的主要功能是将一种电压等级的电能转换成另一种电压等级的电能。通过变换电压使得不同电压等级的电力系统能够相互连接和传输电能。
从功能上来看适配器模式和变压器都起到了“转换”或“适配”的作用使得原本不兼容的双方能够协同工作。
2、命名上的直观性 适配器 这个名称直接描述了该模式的主要功能即适配或转换接口。在计算机领域中适配器通常用于连接不同规格或类型的设备使它们能够相互通信或协同工作。 变压器 这个名称同样直观地描述了其转换电压的功能。在电力系统中变压器是不可或缺的转换设备。
将适配器模式命名为“变压器模式”可以直观地反映出该模式在接口转换方面的作用使得理解和记忆都更加方便。
综上所述适配器模式是一种非常有用的设计模式它能够在不修改现有类的基础上实现接口的转换和适配从而提高代码的复用性和灵活性。然而在使用适配器模式时也需要注意其可能带来的复杂度和维护成本问题。