目 录CONTENT

文章目录

适配器模式

小王同学
2023-12-24 / 0 评论 / 0 点赞 / 42 阅读 / 0 字

适配器模式

微信公众号:新时代程序猿
关注可了解更多的JAVA,PYTHON,ANDROID教程及开发技术。
问题或建议,请公众号留言;
如果你觉得文章对你有帮助,欢迎赞赏

什么是适配器模式

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

这个模式可以通过创建适配器进行接口转换,让不兼容的接口变得兼容。这可以让客户从实现的接口解耦。如果在一段时间之后,我们想要改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着修改。

我们举个例子。有两部手机,一个Android,一个ios,如果我们出门在外只带了一个Android充电线,那是无法直接使用的,因为ios的充电线和Android的不同,所以,我们需要一个适配器。

  • 图片

适配器模式组成结构

  • 客户 (Client):客户类。
  • 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
  • 适配者(Adaptee):需要适配的类或适配者类。
  • 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

(1)“对象”适配器

-图片

适配器模式 UML 图解

这个适配器模式充满着良好的 OO 设计原则:使用对象组合,以修改的接口包装备被适配者;这样做还有一个优点:那就是被适配者的任何子类,都可以搭配着适配器使用。

(2)“类”适配器

看起来“类”适配器和“对象”适配器很类似,唯一的差别就是 Adapter 继承了 Target 与 Adaptee。所以“类”适配器必须要使用多重继承才能实现,在 Java 中这是不可能的。所以这里我们主要介绍“对象”适配器。

适配器模式应用场景

系统需要使用现有的类,而这些类的接口不符合系统的需要。
想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
需要一个统一的输出接口,而输入端的类型不可预知。

适配器模式具体应用

问题描述

有两部手机,一个Android,一个ios,如果我们出门在外只带了一个Android充电线,那是无法直接使用的,因为ios的充电线和Android的不同。需要一个适配器来给ios充电。

代码实现 (“对象”适配器模式)

1.Android数据线:

public class AndroidLine implements  phoneCharge{

    @Override
    public void startCharge(Phone androidPhone) {
        androidPhone.name = "Android";
        androidPhone.startChargeAction();
    }
}

Android的数据线只能给Android手机充电,所以这里我们直接把name写死为“Android”。

2.目标角色:给ios手机充电

public interface AbsIosPhone {
    void startIosCharge(Phone phone);
}

3.数据线转换器

public class IosLineAdapter implements AbsIosPhone{
    AndroidLine androidLine;
    public IosLineAdapter(AndroidLine androidLine) {
        this.androidLine = androidLine;
    }
    @Override
    public void startIosCharge(Phone phone) {
        phone.setName("IOS");
        androidLine.startCharge(phone);
    }
}

这里创建两个手机对象:

public abstract class Phone {
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    abstract void startChargeAction();
}
public class AndroidPhone extends Phone{
    @Override
    void startChargeAction() {
        name = "Android";
        System.out.println(name + "手机开始充电");
    }
}
public class IosPhone extends Phone{

    @Override
    void startChargeAction() {
        name = "IOS";
        System.out.println(name +"手机开始充电");
    }
}

测试:

public class client {
    public static void main(String[] args) {
        //Android 数据线
        AndroidLine androidLine = new AndroidLine();
        androidLine.startCharge(new AndroidPhone());
        //IOS 充电转接头(适配器)
        IosLineAdapter iosLineAdapter = new IosLineAdapter(new AndroidLine());
        iosLineAdapter.startIosCharge(new IosPhone());
    }
}

输出:

Android 手机开始充电
IOS 手机开始充电

适配器模式优点

(1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无需修改原有代码。

(2)增加了类的透明性和复用性,将具体地实现封装在了适配器类中,对客户端来说是透明的,并且提高了适配者地复用性。

(3)客户端面向抽象层编程,可以使用配置文件,方便地更换适配器,也可以在不修改代码的基础上,引入新的适配器,之后只需要将配置文件改为新适配器即可。灵活性和可扩展性非常好。

适配器缺点

(1)如果客户端面向的抽象层是抽象类而不是接口,那么由于只能使用对象适配器,如果适配者方法不能完全满足要求,那么代码量可能较大。

(2)随意引入适配者类,可能会导致系统中类的关联关系混乱,不利于代码的维护。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区