适配器模式(Adapter Pattern)
1.策略模式(Strategy Pattern)2.桥接模式(Bridge Pattern)3.代理模式(Proxy Pattern)4.中介者模式(Mediator Pattern)5.过滤器模式(Filter Pattern)
6.适配器模式(Adapter Pattern)
7.责任链模式(Chain Of Responsibility Pattern)8.装饰器模式(Decorator Pattern)9.建造者模式(Builder Pattern)10.观察者模式(Observer Pattern)11.工厂模式(Factory Pattern)12.单例模式(Singleton Pattern)13.组合模式(Composite Pattern)14.模板模式(Template Pattern)15.原型模式(Prototype Pattern)16.外观模式(Facade Pattern)17.享元模式(Flyweight Pattern)18.命令模式(Command Pattern)19.解释器模式(Interpreter Pattern)20.迭代器模式(Iterator Pattern)适配器模式
一、什么是适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
二、使用条件
1、系统需要使用现有的类,而此类的接口不符合系统的需要。
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)
三、优点和缺点
优点:
- 可以让任何两个没有关联的类一起运行。
- 提高了类的复用。
- 增加了类的透明度。
- 灵活性好。
缺点:
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
- 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。
三、实现方法
1、结构图

2、主要角色
配器模式包含三个角色:
Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。
Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。它是适配器模式的核心。
Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。
3、java 代码实现
目标接口 UserInfo
package com.designpattern.adapterPattern;
/**
* 通过不同的搜索类型获取用户信息
*
* @author zhongtao on 2018/12/4
*/
public interface UserInfo {
void getInfoByType(String type, String search);
}
适配者接口 UserDetailInfo
package com.designpattern.adapterPattern;
/**
* 用户详情 两个接口 通过id或phone获取用户信息
*
* @author zhongtao on 2018/12/4
*/
public interface UserDetailInfo {
void getInfoById(String id);
void getInfoByPhone(String phone);
}
实现适配者接口
/**
* 实现通过id获取用户信息
*
* @author zhongtao on 2018/12/4
*/
public class UserInfoById implements UserDetailInfo {
@Override
public void getInfoById(String id) {
System.out.println("通过用户id获取用户信息,id号:" + id);
}
@Override
public void getInfoByPhone(String phone) {
}
}
/**
* 实现通过电话号码获取用户信息
*
* @author zhongtao on 2018/12/4
*/
public class UserInfoByPhone implements UserDetailInfo {
@Override
public void getInfoById(String id) {
}
@Override
public void getInfoByPhone(String phone) {
System.out.println("通过电话号码获取用户信息,电话号码:" + phone);
}
}
适配器类
package com.designpattern.adapterPattern;
/**
* 获取用户类型的适配器
*
* @author zhongtao on 2018/12/4
*/
public class UserInfoAdapter implements UserInfo {
UserDetailInfo userDetailInfo;
public UserInfoAdapter(String type) {
if (type.equals("ID")) {
userDetailInfo = new UserInfoById();
} else if (type.equals("PHONE")) {
userDetailInfo = new UserInfoByPhone();
}
}
@Override
public void getInfoByType(String type, String search) {
if (type.equals("ID")) {
userDetailInfo.getInfoById(search);
} else if (type.equals("PHONE")) {
userDetailInfo.getInfoByPhone(search);
}
}
}
适配目标实体类
package com.designpattern.adapterPattern;
/**
* 客户需要的目标类
*
* @author zhongtao on 2018/12/4
*/
public class UserInfoSearch implements UserInfo {
/**
* 适配器
*/
UserInfoAdapter userInfoAdapter;
@Override
public void getInfoByType(String type, String search) {
if (type.equals("NAME")) {
System.out.println("通过用户名获取用户信息,用户名:" + search);
} else if (type.equals("ID") || type.equals("PHONE")) {
userInfoAdapter = new UserInfoAdapter(type);
userInfoAdapter.getInfoByType(type, search);
} else {
System.out.println("无效的搜索类型,searchType:" + type);
}
}
}
测试适配者模式
package com.designpattern.adapterPattern;
import org.junit.Test;
/**
* 测试适配器模式
*
* @author zhongtao on 2018/12/4
*/
public class UserInfoSearchTest {
/**
* 测试适配器模式
*/
@Test
public void testAdapter() {
UserInfoSearch userInfoSearch = new UserInfoSearch();
userInfoSearch.getInfoByType("ID", "123456");
userInfoSearch.getInfoByType("PHONE", "13433202125");
userInfoSearch.getInfoByType("NAME", "Peter");
userInfoSearch.getInfoByType("EMAIL", "123@163.com");
}
}
测试结果
通过用户id获取用户信息,id号:123456
通过电话号码获取用户信息,电话号码:13433202125
通过用户名获取用户信息,用户名:Peter
无效的搜索类型,searchType:EMAIL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类