设计模式--适配器模式

适配器模式

适配器模式(Adapter),将一个类的接口转换为客户希望的另一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

系统的数据和行为都正确,但接口不符合时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

结构图

  • Target:客户所期待的接口
java 复制代码
public class Target {
    public void request() {
        System.out.println("普通请求");
    }
}
  • Adaptee:需要适配的类
java 复制代码
public class Adaptee {
    public void specificRequest() {
        System.out.println("特殊请求");
    }
}

Adapter:通过在内部包装一个Adaptee对象,把源接口转换成目标接口

java 复制代码
public class Adapter extends Target {
    private Adaptee adaptee = new Adaptee();
    
    public void request() {
        adaptee.specificRequest();
    }
}
  • 客户端
java 复制代码
Target target = new Adapter();
target.request();

案例

有一场篮球比赛,一队的参赛人员,人员五湖四海,还有外籍的,那么就需要一个翻译(适配器)

人员分为:前锋,中锋,后卫,设置一个球员类,需要进攻和防守的方法即可。

java 复制代码
public abstract class Player {
    protected String name;

    public Player(String name) {
        this.name = name;
    }
    
    abstract void attack(); // 进攻
    abstract void defense(); // 防守
}
  • 前锋,中锋,后卫
java 复制代码
// 前锋
public class Forwards extends Player {
    public Forwards(String name) {
        super(name);
    }
    @Override
    void attack() {
        System.out.println("前锋 " + this.name + "进攻");
    }

    @Override
    void defense() {
        System.out.println("前锋 " + this.name + "防守");
    }
}
// 中锋
public class Center extends Player {

    public Center(String name) {
        super(name);
    }

    @Override
    void attack() {
        System.out.println("中锋 " + this.name + "进攻");
    }

    @Override
    void defense() {
        System.out.println("中锋 " + this.name + "防守");
    }
}

// 后卫
public class Guards extends Player {
    public Guards(String name) {
        super(name);
    }
    @Override
    void attack() {
        System.out.println("后卫 " + this.name + "进攻");
    }

    @Override
    void defense() {
        System.out.println("后卫 " + this.name + "防守");
    }
}

而现在有一个外籍中锋人员,我们还需要给他个翻译。

java 复制代码
// 外籍中锋行为
public class ForeignCenter {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void attackForeign() {
        System.out.println("外籍中锋" + this.name + "进攻");
    }

    public void defenseForeign() {
        System.out.println("外籍中锋" + this.name + "防守");
    }
}
  • 适配器
java 复制代码
public class Translator extends Player {

    private ForeignCenter foreignCenter = new ForeignCenter();
    public Translator(String name) {
        super(name);
        foreignCenter.setName(name);
    }
    @Override
    void attack() {
        foreignCenter.attackForeign();
    }
    @Override
    void defense() {
        foreignCenter.defenseForeign();
    }
}
  • 客户端调用
java 复制代码
Player forwards = new Forwards("张三");
forwards.attack();

Player guards = new Guards("李四");
guards.defense();

Player center = new Translator("Mike");
center.attack();
center.defense();
相关推荐
TDengine (老段)27 分钟前
TDengine 免费版说明
java·大数据·数据库·物联网·时序数据库·tdengine
码上有光31 分钟前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
学计算机的计算基1 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana21 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
万亿少女的梦1682 小时前
基于Spring Boot、Java与MySQL的网络订餐系统设计与实现
java·spring boot·mysql·系统设计·网络订餐
触底反弹2 小时前
🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
人工智能·设计模式·面试
咩咩啃树皮10 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚11 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白12 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司13 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求