设计模式-第14章(适配器模式)
创始人
2024-06-03 12:34:28
0

适配器模式

  • 适配器模式
  • 篮球翻译适配器
  • 适配器模式总结

适配器模式

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

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

在这里插入图片描述
Target(客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口)。
Adaptee 需要适配的类,想要复用的代码。
Adapter 适配器类,在内部包装一个 Adaptee 对象,把源接口转换成目标接口。

Target 接口

//客户期待的接口
class Target {public void request(){System.out.println("普通请求!");}
}

需要适配的类 Adaptee

class Adaptee {public void specificRequest(){System.out.println("特殊请求!");}
}

适配器类 Adapter,将 Adaptee 转换为 Target 接口

//适配器类
class Adapter extends Target {//建立一个私有的Adaptee对象private Adaptee adaptee = new Adaptee(); //这样就可以把表面上调用request()方法public void request(){//变成实际调用specificRequest()     adaptee.specificRequest();  }
}

何时使用适配器模式?
如果想使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,应当考虑用适配器模式。两个类所做的事情相同或相似,但是具有不同的接口时要使用它。

篮球翻译适配器

在这里插入图片描述
外籍球员通过翻译者与本土球员进行交流。
外籍球员类就是要进行适配的类。翻译者就是适配器类。Player 就是目标接口。

球员接口,就是目标接口。

abstract class Player {protected String name;public Player(String name){this.name = name;}public abstract void attack();  //进攻public abstract void defense(); //防守
}
// 前锋
class Forwards extends Player {public Forwards(String name){super(name);}public void attack(){System.out.println("前锋 "+this.name+" 进攻");}public void defense(){System.out.println("前锋 "+this.name+" 防守");}
}
// 中锋
class Center extends Player {public Center(String name){super(name);}public void attack(){System.out.println("中锋 "+this.name+" 进攻");}public void defense(){System.out.println("中锋 "+this.name+" 防守");}
}// 后卫
class Guards extends Player {public Guards(String name){super(name);}public void attack(){System.out.println("后卫 "+this.name+" 进攻");}public void defense(){System.out.println("后卫 "+this.name+" 防守");}
}

外籍中锋(待适配的类)

//外籍中锋
class ForeignCenter {private String name;public String getName(){return this.name;}public void setName(String value){this.name = value;}public void 进攻(){System.out.println("外籍中锋 "+this.name+" 进攻");}    public void 防守(){System.out.println("外籍中锋 "+this.name+" 防守");}
}

翻译者类(适配类,将外籍中锋适配到目标接口)

// 实现目标接口所需要的方法
class Translator extends Player {// 包含一个待适配的类private ForeignCenter foreignCenter = new ForeignCenter();public Translator(String name){super(name);foreignCenter.setName(name);}public void attack(){foreignCenter.进攻();}public void defense(){foreignCenter.防守();}
}

适配器模式总结

适配器模式不能乱用,只有碰到无法改变原有设计和代码的情况时,才考虑适配。
事后控制不如事中控制,事中控制不如事前控制。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...