java设计模式之适配器模式
适配器模式的定义:适配器模式又叫作变压器模式,它的功能是将一个类的接口变成客户端所期望的另一个接口,从而使原本因接口不匹配而导致 无法在一起工作的两个类能够一起工作,属于结构型设计模式。 在软件开发过程中,基本上任何问题都可以通过增加一个中间层来解决。适配器模式其实就是一个中间层。适配器模式起着转化 /委托的作用,将一种接口转化为另一种符合需要的接口。 适配器模式的应用场景:
适配器模式有三种形式:类适配器、对象适配器、接口适配器。适配器模式一般包含三个角色:
类适配器的UML类图以及通用写法:类适配器的原理就是通过继承来实现适配器功能。具体做法就是Adapter继承Adaptee并实现ITarget接口,这样Adapter就具备了Adaptee和ITarget的特性,可以将 两者进行转化,其UML类图如下: ? ? 我们用一个例子来进行讲解。在中国,民用电都是220V交流电,但用手机使用的锂电池使用的是5V的直流电。因此,当手机充电时,需要使用电源适配器来进行转换, 我们用代码来还原这个场景,首先创建Adaptee角色类,需要被转换的对象AC220,表示220V交流电。 public class AC220 {
public int outputAC220V(){
int output = 220;
System.out.println("输出电压" + output + "V");
return output;
}
}
创建ITarget角色DC5接口,表示5V直流电。 public interface DC5 { int output5V(); } 创建Adapter角色的电源适配器PowerAdapter类。 class PowerAdapter extends AC220 implements output5V() { int adapterInput = super.outputAC220V(); int adapterOutput = adapterInput / 44; System.out.println("使用Adapter输入AC" + adapterInput + "V,输出DC" + adapterOutput + "V"); return adapterOutput; } } 测试代码。 class Test { static void main(String[] args) { DC5 adapter = new PowerAdapter(); adapter.output5V(); } } 对象适配器的UML类图及通用写法:对象适配器的原理就是通过组合来实现适配器的功能。具体做法是,首先让Adapter实现ITarget接口,然后内部持有Adaptee实例。这样做使得代码更加灵活,比如 我们需要将两个不同的源角色(Adaptee)整合成一个ITarget目标角色,显然这个时候用继承就没办法实现了,所以这也是为什么我们要多用组合少用继承的原因。其UML 类图如下: ? ?接前面的示例,代码只需要更改Adapter实现,及去掉继承Adaptee类,并将Adaptee作为内部属性注入,其他与类适配器一致。 private AC220 ac220; public PowerAdapter(AC220 ac220) { this.ac220 = ac220; } int adapterInput = ac220.outputAC220V(); adapterOutput; } } 接口适配器的UML类图及通用写法:接口适配器的关注点和前面两个适配器不太一样,当我们的源角色和目标角色的接口能够匹配的情况下,但是我们的目标角色可能包含多个源角色的功能, 也就是有其他的除了源角色对应抽象方法以外的抽象方法,这样如果我们目标角色之间实现源角色接口的话,会多出许多空的实现方法,显得臃肿。此时就需要 使用接口适配器来实现了,接口适配器的UML类图以及写法都和对象适配器的完全一样,唯一的区别是,在目标角色接口中多了几个抽象方法,然后在适配器角 色中多了抽象方法对应的源角色属性注入。所以这里就不再列举了。 适配器模式的优点:
适配器模式的缺点:
? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |