推荐:Java设计模式汇总
适配器模式
定义
将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。
类型
结构型。
分类
类适配器、对象适配器。
角色
目标接口:Target,该角色把其他类转换为我们期望的接口。
被适配者: Adaptee ,原有的接口,也是希望被适配的接口。
适配器: Adapter, 将被适配者和目标接口组合到一起的类。
类适配器
Adaptee类。
package com.kaven.design.pattern.structural.adapter.classadapter;
public class Adaptee {
public void adapterRequest(){
System.out.println("被适配者的方法");
}
}
Target接口。
package com.kaven.design.pattern.structural.adapter.classadapter;
public interface Target {
void request();
}
ConcreteTarget类,具体目标类,实现了Target接口。
package com.kaven.design.pattern.structural.adapter.classadapter;
public class ConcreteTarget implements Target {
public void request() {
System.out.println("concreteTarget目标方法");
}
}
Adapter类,继承了Adaptee类,实现了Target接口。
package com.kaven.design.pattern.structural.adapter.classadapter;
public class Adapter extends Adaptee implements Target {
public void request() {
super.adapterRequest();
}
}
Adapter类继承了Adaptee类,所以称为类适配器
。
应用层代码:
package com.kaven.design.pattern.structural.adapter.classadapter;
public class Test {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
输出:
concreteTarget目标方法
被适配者的方法
对象适配器
package com.kaven.design.pattern.structural.adapter.objectadapter;
public class Adaptee {
public void adapterRequest(){
System.out.println("被适配者的方法");
}
}
package com.kaven.design.pattern.structural.adapter.objectadapter;
public interface Target {
void request();
}
package com.kaven.design.pattern.structural.adapter.objectadapter;
public class ConcreteTarget implements Target {
public void request() {
System.out.println("concreteTarget目标方法");
}
}
前面的这些类和类适配器中的一样。
Adapter类,实现了Target接口。
package com.kaven.design.pattern.structural.adapter.objectadapter;
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
public void request() {
adaptee.adapterRequest();
}
}
Adapter类没有继承Adaptee类,而是与Adaptee类实例进行组合,这便是对象适配器
。
应用层代码:
package com.kaven.design.pattern.structural.adapter.objectadapter;
public class Test {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
输出:
concreteTarget目标方法
被适配者的方法
结果是一样,只是Adapter类与Adaptee类的关系不同而已。
例子
我们平时用充电器给手机充电,充电器可能需要将220v的电压转换成5v的电压,我们才能给手机正常充电。
AC220类(Adaptee),被适配者类,原有220v的电压。
package com.kaven.design.pattern.structural.adapter;
public class AC220 {
public int outputAC220V(){
int output = 220;
System.out.println("输出交流电"+output+"V");
return output;
}
}
DC5类(Target接口),目标接口,需要转换成5v的电压。
package com.kaven.design.pattern.structural.adapter;
public interface DC5 {
int outputDC5V();
}
PowerAdapter类(Adapter类),适配器类,将220v的电压转换成5v的电压。
package com.kaven.design.pattern.structural.adapter;
public class PowerAdapter implements DC5 {
private AC220 ac220 = new AC220();
public int outputDC5V() {
int adapterInput = ac220.outputAC220V();
//变压器...
int adapterOutput = adapterInput/44;
System.out.println("使用PowerAdapter输入AC"+adapterInput+"V"+"输出DC"+adapterOutput+"V");
return adapterInput;
}
}
应用层代码:
package com.kaven.design.pattern.structural.adapter;
public class Test {
public static void main(String[] args) {
DC5 dc5 = new PowerAdapter();
dc5.outputDC5V();
}
}
输出:
输出交流电220V
使用PowerAdapter输入AC220V输出DC5V
这里便完成了一个简单的适配器模式例子。
适用场景
- 想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
- 我们有一个类,想将其设计为可重用的类,我们可以创建适配器,将这个类来适配其他没有提供合适接口的类。
优点
- 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。
- 增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者类的复用性,同一个适配者类可以在多个不同的系统中复用。
- 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,符合“开闭原则”。
缺点
适配器模式最好在详细设计不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题。
如果有说错的地方,请大家不吝赐教(记得留言哦~~~~)。