概念

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

适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,比如在需要对早期代码复用一些功能等应用上很有实际价值。

代码实现

目录结构:



具体代码:

Player接口、也是客户端所期待的接口、Target
package service;

/**
 * @author SHshuo
 * @data 2021/10/16--19:30
 * 球员抽象类、相当于客户所期待的接口Target
 */
public interface Player {
//    进攻
    void attack();

//    防守
    void defense();
}

具体实现的正常类Forwards、Guards
package service.Impl;

import service.Player;

import javax.security.auth.Subject;

/**
 * @author SHshuo
 * @data 2021/10/16--20:02
 * 前锋
 */
public class Forwards implements Player {

    private String name;

    public Forwards(String name){
        this.name = name;
    }
    @Override
    public void attack() {
        System.out.println(name + "发起进攻");
    }

    @Override
    public void defense() {
        System.out.println(name + "进行防守");
    }
}


ForeignCenter 需要适配的类Adatee
package service.Impl;

import service.Player;

import javax.security.auth.Subject;

/**
 * @author SHshuo
 * @data 2021/10/16--19:44
 * 外籍中锋,相当于需要适配的类Adaptee
 */
public class ForeignCenter {

    private String name;

    public ForeignCenter(String name){
        this.name = name;
    }

    public void chineseAttack() {
        System.out.println(name + "发起进攻");
    }

    public void chineseDefense() {
        System.out.println(name + "进行防守");
    }
}

Translator适配类(Adapter通过在内部包装一个Adaptee对象,把源接口转换成目标接口)
package service.Impl;

import service.Player;

/**
 * @author SHshuo
 * @data 2021/10/17--9:38
 * 翻译、相当于适配器Adapter
 */
public class Translator implements Player {

    ForeignCenter foreignCenter;

    public Translator(String name){
        foreignCenter = new ForeignCenter(name);
    }
    @Override
    public void attack() {
        foreignCenter.chineseAttack();
    }

    @Override
    public void defense() {
        foreignCenter.chineseDefense();
    }
}

Client只需要统一的调用同一个接口就行,这样可以更简单、更直接、更紧凑
package controller;

import service.Impl.Forwards;
import service.Impl.Guards;
import service.Player;

/**
 * @author SHshuo
 * @data 2021/10/16--15:07
 * 适配器模式Adapter
 */
public class Client {
    public static void main(String[] args) {

        Player forwards = new Forwards("巴蒂尔");
        forwards.attack();

        Player guards = new Guards("麦克格雷迪");
        guards.attack();

//        通过适配器即翻译通知姚明进攻
        Player translator = new Forwards("姚明");
        translator.attack();
    }
}

UML类图




项目前期、接口不同时应该考虑通过重构统一接口。项目后期的维护、接口不同时应该考虑通过适配器模式适配。


应用

  1. DataAdapter用作DataSet和数据源之间的适配器以便检索和保存数据。DataAdapter通过映射Fill(这更改了DataSet中的数据以便与数据源中的数据相匹配)和Update(这更改了数据源中的数据以便与DataSet中的数据相匹配)来提供这一适配器。