-定义
使用 || 不同接口的类||所提供的服务 || 为客户端提供它所期望的接口 (断句已经用||分开,使用各种可能的服务,为客户端提供它所期望的接口)
-举例说明
-例1 - 我们工作的电脑,需要正常使用,必须提供标准的电源服务(额定电压,功率等),但是有可能某些情况下
你使用的电源并非计算机要求的标准电源,如:电脑标准电源服务需要110V的额定电压,但是生活用电为220V,工业用电为360V,
均不能满足需求,而此时我们就需要用到电源适配器来使得生活用电或者工业用电能为电脑提供所期望的电压。
-例2 - 我们在开发程序的过程中,很多地方需要记录日志,知道slf4j
的同事都知道,slf4j
并没有提供相应的日志功能的实现,
要让他正常工作,我们需要提供一个具体的日志实现类(e.g. java.util.logging, logback, log4j)
光是有这些样东西还是不够的,他们没有办法组合起来提供服务,如何才能让Log4j
或者logback
为slf4j
提供日志服务呢?这个时候就需要一个适配器,将两个东西组合在一起`(e.g. slf4j-log4j12,jcl-over-slf4j,log4j-slf4j-impl等)
-代码实现
我们来简单实现例子1所介绍的情况
/**
* 电脑
* @author Juniter
*
*/
public class PC {
private PCPowerStandard standard;
public void use () {
this .standard.powerService();
System.out.println("Computer Work Well!" );
}
public void setStandard (PCPowerStandard standard) {
this .standard = standard;
}
}
PCPowerStandard – 电脑所使用的电源标准接口
public interface PCPowerStandard {
void powerService();
}
HomePowerStandard – 家用电标准
/**
* 家用电标准
* @author Juniter
*
*/
public interface HomePowerStandard {
void homePowerService();
}
/**
* 标准家庭用电
*
* @author Juniter
*
*/
public class HomePower implements HomePowerStandard {
@Override
public void homePowerService () {
System.out.println("Home Power Standard! 220 Volet!" );
}
}
HomePowerAdapter – 让家用电源为电脑供电 – 转换家用电为电脑用电
/**
* 家用电源适配器,实现了电脑标准电源接口,通过接口的powerService()方法
*
* 用家用电源来为电脑供电
*
* @author Juniter
*
*/
public class HomePowerAdapter implements PCPowerStandard {
private HomePower homePower;
public HomePowerAdapter (HomePower homePower) {
this .homePower = homePower;
}
@Override
public void powerService () {
this .homePower.homePowerService();
System.out.println("Transform HomePower To Computer Standard Power!" );
}
}
Example – 现在电脑可以正常工作了,我们为电脑注入家庭电源(注意,在没有电源的情况下,电脑无法使用
public class Example {
public static void main (String args[]) {
PC pc = new PC();
pc.setStandard(new HomePowerAdapter(new HomePower()));
pc.use();
}
}
Home Power Standard ! 220 Volet !
Transform HomePower To Computer Standard Power !
Computer Work Well !
接下来我们再看注入工业电源
IndustryPowerStandard – 工业电源标准接口
public interface IndustryPowerStandard {
void industryPowerService();
}
/**
* 标准工业用电
*
* @author Juniter
*
*/
public class IndustryPower implements IndustryPowerStandard {
@Override
public void industryPowerService () {
System.out.println("Industry Power Standard! 360 Volet!" );
}
}
IndustryPowerAdapter – 工业电源适配器,转换工业用电为电脑用电
/**
* 工业电源适配器,实现了电脑标准电源接口,通过接口的powerService()方法
*
* 用工业电源来为电脑供电
*
* @author Juniter
*
*/
public class IndustryPowerAdapter implements PCPowerStandard {
private IndustryPower industryPower;
public IndustryPowerAdapter (IndustryPower industryPower) {
this .industryPower = industryPower;
}
@Override
public void powerService () {
this .industryPower.industryPowerService();
System.out.println("Transform IndustryPower To Computer Standard Power!" );
}
}
Example – 现在电脑可以正常工作了,我们为电脑注入家庭电源和工业电源(注意,在没有电源的情况下,电脑无法使用
public class Example {
public static void main (String args[]) {
PC pc = new PC();
pc.setStandard(new HomePowerAdapter(new HomePower()));
pc.use();
pc.setStandard(new IndustryPowerAdapter(new IndustryPower()));
pc.use();
}
}
Home Power Standard ! 220 Volet !
Transform HomePower To Computer Standard Power !
Computer Work Well !
Industry Power Standard ! 360 Volet !
Transform IndustryPower To Computer Standard Power !
Computer Work Well !
总结
从示例可以得出以下结论,适配器需要实现客户端(PC)所依赖的接口(PCPowerStandard)才能达到适配的目的。适配器需要注入具体的实现类(实例)来执行相应的操作(HomePower、IndustryPower)。虽然他们实现自不同的接口,但是通过适配器,我们可以将他们所提供的服务,提供给客户端(PC)使用,这便是适配器模式。也便解释了适配器模式的定义:
使用 || 不同接口的类(HomePower、IndustryPower)||所提供的服务(powerService()) || 为客户端提供它所期望的接口(Adapter)