适配器模式(Adapter)

概念

将一个类的接口转换成客户端希望的另外一个接口。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中的数据相匹配)来提供这一适配器。
hshuo的面试之路 文章被收录于专栏

作者目标是找到一份Java后端方向的工作 此专栏用来记录从Bilibili、书本、其他优质博客上面学习的内容 用于巩固、总结内容 主要包含Docker、Dubbo、Java基础、JUC、Maven、MySQL、Redis、SpringBoot、SpringCloud、数据结构、杂文、算法、计算机网络、操作系统、设计模式等相关内容

全部评论

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务