Java设计模式—适配器模式

一、定义

共有两类适配器模式

对象适配器模式
在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的方法。

类适配器模式
这种适配器模式下,适配器继承自已实现的类。


二、解释

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

基本概念

客户:需要调用我们的代码的对象。
Adapter模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。

主要内容

(1)类适配器
当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。

(2)对象适配器
对象适配器”通过组合除了满足“用户期待接口”还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。下面是对象适配器的UML图:

(3) 缺省适配器模式
缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是“平庸”的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。


三、代码示例 (出自Java设计模式之《适配器模式》及应用场景

接口定义

USB.java

public interface USB {
   void isUsb();
}

PS2.java

public interface PS2 {
    void isPS2();
}

目标类

public class Usber implements USB {
    @Override
    public void isUsb() {
        System.out.println("USB接口");
    }
}

1、类适配器

通过继承实现适配功能

Adapter1.java

public class Adapter1 extends Usber implements PS2 {
    @Override
    public void isPS2() {
        isUsb();
    }
}

测试类 Test.java

public class Test {

    public static void main(String[] args) {
        PS2 ps2 = new Adapter1();
        System.out.print("PS2接口适配完成,输出:");
        ps2.isPS2();
    }
}

输出结果
PS2接口适配完成,输出:USB接口

2、对象适配器

通过组合实现适配功能

Adapter2.java

public class Adapter2 implements PS2{

    private USB usb;

    public Adapter2(USB usb) {
        this.usb = usb;
    }

    @Override
    public void isPS2() {
        usb.isUsb();
    }
}

测试类 Test.java

public class Test {

    public static void main(String[] args) {
        PS2 ps2_1 = new Adapter2(new Usber());
        System.out.print("PS2接口适配完成,输出:");
        ps2_1.isPS2();
    }
}

输出结果
PS2接口适配完成,输出:USB接口

3、缺省适配器

使用场景
1.接口中规定了所有要实现的方法
2.但一个要实现此接口的具体类,只用到了其中的几个方法,而其它的方法都是没有用的。

假设我们有一个接口Funcs,其中定义N多方法

public interface Funcs {
    void a();
    void b();
    void c();
    void d();
    void e();
    void f();
}

但实现类只需要实现部分方法(假设需要a()、f()方法)即可,此时我们可以定义一个中间类,实现接口Funcs

public abstract class Adapter3 implements Funcs {
    @Override
    public void a() {

    }

    @Override
    public void b() {

    }

    @Override
    public void c() {

    }

    @Override
    public void d() {

    }

    @Override
    public void e() {

    }

    @Override
    public void f() {

    }
}

实现类只需继承此Adapter3类,选择需要的方法实现即可。

public class MyClass extends Adapter3 {

    @Override
    public void a() {
        super.a();
        //具体实现
    }

    @Override
    public void f() {
        super.f();
        //具体实现
    }

}

测试类

public class Test {
    public static void main(String[] args) {
        Funcs funcs = new MyClass();
        funcs.a();
        funcs.f();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在...
    步积阅读 1,381评论 0 1
  • 适配器模式的官方定义是:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起...
    li_jun阅读 309评论 0 0
  • Java设计模式之适配器模式 回顾 上一期设计模式跟大家分享了创建模式的最后一个(生成器模式),如果小伙伴们掌握的...
    icyage阅读 361评论 0 0
  • 适配器模式 什么是适配器模式呢?比如说客户端中需要一个Sort() 函数,它可以实现简单的排序功能,但是这个时候,...
    ghwaphon阅读 611评论 0 0
  • 今年五月份的时候,我参加了在南京大学举办的亿兹集团暑期实习宣讲会,虽然投递的简历石沉大海,但是在宣讲会上我却收获了...
    Megan颀阅读 804评论 0 5