> 文档中心 > 【设计模式】结构型模式之适配器模式

【设计模式】结构型模式之适配器模式

目录

前言

定义

结构组件

分类及实现

适配器模式(采用继承实现)

角色及目标角色

适配器实现

测试及结果

 对象适配器模式(采用对象组合方式实现)

适配器实现

测试及结果

接口适配器模式

优缺点


前言

说起适配器模式,其实生活中有许多适配器应用的场景。比如,家里的插座只有两孔,但是电脑充电器是三孔,怎么办,这是时候就需要买一个转换头,这个转换头就是适配器。

定义

将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

结构组件

目标角色(Target):就是所期待得到的接口,也就是这类的接口是符合我们要求的。

源角色(Adaptee):我们要使用的接口,但是这个接口不符合我们的要求,也就是现在需要适配的接口。

适配器角色(Adapter):适配器类是适配器模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。

分类及实现

类适配器模式(采用继承实现)

源角色及目标角色

package com.inchlifc;/***源角色*/public class Adaptee {    public void specificRequest() { System.out.println("特殊请求,这个是源角色");    }}package com.inchlifc;/** * @description 这个是目标角色,所期待的接口 */public interface Target {    public void request();}

适配器实现

现在想要实现这个Target接口,但是不想重构,想要用上已有的Adaptee类,这时可以定义一个适配器类继承想要使用的类,并且实现期待的接口

package com.inchlifc;class Adapter extends Adaptee implements Target{    @Override    public void request() { super.specificRequest();    }}

测试及结果

package com.inchlifc;/** * @author inchlifc * @description 测试 */public class Test {    public static void main(String[] args) { System.out.println("------>类适配器模式测试:"); Target target = new Adapter(); target.request();    }}

 对象适配器模式(采用对象组合方式实现)

源角色和目标角色与上面例子相同

适配器实现

package com.inchlifc;class Adapter implements Target{    private Adaptee adaptee;    public Adapter (Adaptee adaptee) { this.adaptee= adaptee;    }    @Override    public void request() { this.adaptee.specificRequest();    }}

测试及结果

package com.inchlifc;/** * @author inchlifc * @description 测试 */public class Test {    public static void main(String[] args) { System.out.println("------>对象适配器模式测试:"); Target adapter = new Adapter(new Adaptee()); adapter.request();    }}

接口适配器模式

通过抽象类实现目标接口,然后用匿名内部类来对想要的接口方法进行改造,即可完成接口适配。代码如下: 

//目标接口package com.inchlifc; public interface Interface4 {public void m1();public void m2();public void m3();public void m4();}//抽象类package com.inchlifc; //抽象类public abstract class AbsAdapter implements Interface4 { //实现4接口public void m1() { } public void m2() { } public void m3() { }public void m4() {}}package com.inchlifc; public class Test{public static void main(String[] args) {AbsAdapter absAdapter = new AbsAdapter() {//ֻ只需要覆盖我们使用的接口方法@Overridepublic void m1() {System.out.println("覆盖后的m1方法");} };absAdapter.m1();}}

优缺点

该模式的主要优点如下:

  • 客户端通过适配器可以透明地调用目标接口。
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
  • 在很多业务场景中符合开闭原则。

其缺点是:

  • 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
  • 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。