详解设计模式:适配器模式

2022-12-02 08:31:27 浏览数 (1)

适配器模式(Adapter Pattern)又称为变压器模式,是 GoF 的 23 种设计模式中的一种结构型设计模式。适配器模式 的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作 ~ 本篇内容包括:关于适配器模式、适配器的实现 Demo


文章目录
  • 一、关于适配器模式
    • 1、关于适配器模式
    • 2、关于适配器模式的构成
    • 3、关于适配器模式的UML
    • 4、关于适配器类
    • 5、关于适配器模式的优缺点

  • 二、适配器的实现 Demo
    • 1、Demo 设计
    • 2、Demo 实现
    • 3、Demo 测试

一、关于适配器模式

1、关于适配器模式

适配器模式(Adapter Pattern)又称为变压器模式,是 GoF 的 23 种设计模式中的一种结构型设计模式。

适配器模式 的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作

2、关于适配器模式的构成

适配器模式一般包含三种角色:

  1. 目标(Target):目标是一个接口,该接口是客户想要使用的接口。
  2. 被适配者(Adaptee):被适配者是一个已经存在的接口或抽象类,这个接口或抽象类需要被适配。
  3. 适配器(Adapt):适配者是一个类,该类实现了目标接口并包含有适配者的引用,即适配者的职责是对被适配者接口(抽象类)与目标接口进行适配。
3、关于适配器模式的UML
4、关于适配器类
代码语言:javascript复制
public class Adapter extends Adaptee implements Target{
    @Override
    public void request() {
        //...一些操作...
        super.adapteeRequest();
        //...一些操作...
    }
}
5、关于适配器模式的优缺点

# 适配器模式优点

  • 可以让任何两个没有关联的类一起运行。
  • 提高了类的复用。
  • 增加了类的透明度。
  • 灵活性好。

# 适配器模式缺点

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
  • 由于 Java 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

# 使用场景

  • 有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

二、适配器的实现 Demo

1、Demo 设计

我们新买了一个华为 mate50 手机,但是来朋友家做客没携带充电器,朋友家只有 Ios 的充电器,所以我们需要让 Ios 充电接口支持我们的 mate50 的 Type-C 充电。

2、Demo 实现

# TypeCharger 目标(Target)

代码语言:javascript复制
/**
 * Type-c充电接口
 **/
public interface TypecCharger {

    /**
     * 充电方法
     */
    void typecCharger();
}
 
/**
 * Type-c充电
 **/
public class Typec implements TypecCharger {
    
    @Override
    public void typecCharger() {
        System.out.println("Type-c接口充电");
    }
}

# IosCharger 被适配者(Adaptee)

代码语言:javascript复制
/**
 * Ios充电接口
 **/
public interface IosCharger {
    /**
     * 充电方法
     */
    void iosCharger();
}
 
/**
 * Ios充电
 **/
public class Ios implements IosCharger {
    
    @Override
    public void iosCharger() {
        System.out.println("Ios接口充电");
    }
}

# FriendHome

代码语言:javascript复制
/**
 * 在朋友家充电(只有Ios充电口)
 **/
public class FriendHome {
    private IosCharger iosCharger;

    public FriendHome(IosCharger iosCharge) {
        this.iosCharger = iosCharge;
    }

    /**
     * 充电
     */
    public void charge(){
        this.iosCharger.iosCharger();
    }
}

# ChargerAdapter 适配器(方式一)

代码语言:javascript复制
/**
 * 适配器接口
 **/
public class ChargerAdapter implements IosCharger {
    
    private TypecCharger typec;

    public ChargerAdapter(Typec typec) {
        this.typec = typec;
    }

    @Override
    public void iosCharger() {
        typec.typecCharger();
    }
}

# ChargerAdapter 适配器(方式二)

代码语言:javascript复制
public class ChargerAdapter extends Typec implements IosCharger {

    @Override
    public void iosCharger() {
        this.typecCharger();
    }
    
}
3、Demo 测试
代码语言:javascript复制
public class Client {

    public static void main(String[] args) {
        // 原本只有 Ios 充电口
        FriendHome home = new FriendHome(new Ios());
        home.charge();

        System.out.println("*******************");

        // 使用适配器之后旅馆支持ios充电了
        ChargerAdapter chargerAdapter = new ChargerAdapter(new Typec());
        home = new FriendHome(chargerAdapter);
        home.charge();
    }

}

0 人点赞