【设计模式】【结构型模式(Structural Patterns)】之适配器模式(Adapter Pattern)

news/2024/11/29 1:15:57/

1. 设计模式原理说明

适配器模式(Adapter Pattern) 是一种结构型设计模式,它允许不兼容的接口协同工作。适配器模式可以将一个类的接口转换成另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式分为两种主要类型:类适配器和对象适配器。

主要角色
  1. Target(目标接口):这是客户端所期望的接口,客户端通过这个接口与适配器进行交互。
  2. Adaptee(适配者):这是需要适配的类,它具有不同的接口,但提供了我们需要的功能。
  3. Adapter(适配器):它是一个适配者类和目标接口之间的适配器,它实现了目标接口,并持有对适配者的引用,通过委托调用适配者的方法。

2. UML 类图及解释

UML 类图
+----------------+                +---------------------+
|     Target     |                |      Adaptee        |
|----------------|                |---------------------|
| + request(): void              | + specificRequest(): void|
+----------------+                +---------------------++----------------+                         |
|     Adapter    |                         |
|----------------|                         |
| - adaptee: Adaptee                       |
| + request(): void                        |
+----------------+                         |+----------------+                         |
|     Client     |                         |
|----------------|                         |
| + mainMethod(): void                     |
+----------------+                         |
类图解释
  • Target:定义了客户端所期望的接口。客户端通过这个接口与适配器进行交互。
  • Adaptee:这是需要适配的类,它具有不同的接口,但提供了我们需要的功能。
  • Adapter:实现了 Target 接口,并持有对 Adaptee 的引用。适配器通过委托调用 Adaptee 的方法来实现 Target 接口的方法。
  • Client:客户端通过 Target 接口与适配器进行交互,从而间接使用 Adaptee 的功能。

3. 代码案例及逻辑详解

Java 代码案例
// 目标接口
interface Target {void request();
}// 需要适配的类
class Adaptee {public void specificRequest() {System.out.println("Adaptee's specificRequest method is called.");}
}// 适配器类
class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}// 客户端
class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target adapter = new Adapter(adaptee);adapter.request(); // 调用适配器的 request 方法}
}
C++ 代码案例
#include <iostream>// 目标接口
class Target {
public:virtual void request() = 0;virtual ~Target() {}
};// 需要适配的类
class Adaptee {
public:void specificRequest() {std::cout << "Adaptee's specificRequest method is called." << std::endl;}
};// 适配器类
class Adapter : public Target {
private:Adaptee* adaptee;public:Adapter(Adaptee* adaptee) : adaptee(adaptee) {}~Adapter() {delete adaptee;}void request() override {adaptee->specificRequest();}
};// 客户端
int main() {Adaptee* adaptee = new Adaptee();Target* adapter = new Adapter(adaptee);adapter->request(); // 调用适配器的 request 方法delete adapter;return 0;
}
Python 代码案例
# 目标接口
class Target:def request(self):pass# 需要适配的类
class Adaptee:def specific_request(self):print("Adaptee's specific_request method is called.")# 适配器类
class Adapter(Target):def __init__(self, adaptee):self.adaptee = adapteedef request(self):self.adaptee.specific_request()# 客户端
if __name__ == "__main__":adaptee = Adaptee()adapter = Adapter(adaptee)adapter.request()  # 调用适配器的 request 方法
Go 代码案例
package mainimport "fmt"// 目标接口
type Target interface {Request()
}// 需要适配的类
type Adaptee struct{}func (a *Adaptee) SpecificRequest() {fmt.Println("Adaptee's specificRequest method is called.")
}// 适配器类
type Adapter struct {adaptee *Adaptee
}func (a *Adapter) Request() {a.adaptee.SpecificRequest()
}// 客户端
func main() {adaptee := &Adaptee{}adapter := &Adapter{adaptee: adaptee}adapter.Request() // 调用适配器的 Request 方法
}

4. 总结

适配器模式 是一种结构型设计模式,它允许不兼容的接口协同工作。适配器模式通过创建一个适配器类来实现目标接口,并持有对适配者类的引用,从而将适配者的方法转换为目标接口的方法。

主要优点
  1. 提高了类的复用性:通过适配器模式,可以重用现有的类,而不需要修改它们的源代码。
  2. 增加了灵活性适配器模式使得系统更易于扩展,因为可以在不修改原有代码的情况下引入新的适配器。
  3. 分离接口和实现适配器模式将接口和实现分离,使得系统的职责更加清晰。
主要缺点
  1. 增加了系统的复杂性适配器模式会增加系统的类的数量,从而使系统更加复杂。
  2. 过度设计的风险:如果在没有必要的情况下使用适配器模式,可能会导致过度设计。

总的来说,适配器模式适用于以下场景:

  • 当希望使用一个已经存在的类,但其接口不符合需求时。
  • 当希望创建一个可以复用的类,该类可以与其他不兼容的类或接口一起工作时。
  • 当需要在系统中动态地添加或删除某些功能时,适配器模式可以提供一种灵活的解决方案。

http://www.ppmy.cn/news/1550774.html

相关文章

Java MySQL 连接

Java MySQL 连接 本章节我们为大家介绍 Java 如何使用 使用 JDBC 连接 MySQL 数据库。 Java 连接 MySQL 需要驱动包&#xff0c;最新版下载地址为&#xff1a;http://dev.mysql.com/downloads/connector/j/&#xff0c;解压后得到 jar 库文件&#xff0c;然后在对应的项目中导…

鸿蒙面试 --- 性能优化

性能优化可以从三个方面入手 感知流畅、渲染性能、运行性能 感知流畅 在应用开发中&#xff0c;动画可以为用户界面增添生动、流畅的交互效果&#xff0c;提升用户对应用的好感度。然而&#xff0c;滥用动画也会导致应用性能下降&#xff0c;消耗过多的系统资源&#xff0c;…

信息技术与数据安全:打造高效、安全的数据处理系统

信息技术与数据安全&#xff1a;打造高效、安全的数据处理系统 在当今这个信息化高速发展的时代&#xff0c;数据已成为企业运营和决策的核心资源。随着大数据、云计算、人工智能等信息技术的飞速发展&#xff0c;数据处理能力得到了前所未有的提升&#xff0c;但同时也对数据…

windows C#-使用反射访问特性

你可以定义自定义特性并将其放入源代码中这一事实&#xff0c;在没有检索该信息并对其进行操作的方法的情况下将没有任何价值。 通过使用反射&#xff0c;可以检索通过自定义特性定义的信息。 主要方法是 GetCustomAttributes&#xff0c;它返回对象数组&#xff0c;这些对象在…

Unity类银河战士恶魔城学习总结(P142 Save System 保存系统)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了保存系统的初步建立 windows系统最终货币的保存文件被保存在如下路径下 SaveManager.cs 功能概述 SaveManager 是一个单例…

九、Ubuntu Linux操作系统

一、Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shutteworth)创办的基于Debian Linux的操作系统&#xff0c;于2004年10月公布Ubuntu是一个以桌面应用为主的Linux发行版操作系统Ubuntu拥有庞大的社区力量&#xff0c;用户可以方便地从社区获得帮助其官方网站:http…

在React中实践一些软件设计思想 ✅

策略设计模式 先写几句废话&#xff1a;其实在日常开发中&#xff0c;「设计模式」通常在不知不觉间已经被用了不少了&#xff0c;只是我们或许没察觉。比如通过插槽来增强组件的功能&#xff0c;这涉及到「装饰设计模式」&#xff1b;lodash或者jQuery的使用我觉得甚至算得上…

windows docker 入门

这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步&#xff1a;安装Docker Desktop for Windows 系统要求&#xff1a; Windows 10 64位版本&#xff08;专业版、企业版或教育版&#xff09;。启用Hyper-V和Windows Subsystem for Linux (WSL 2)。…