首页 > 其他分享 >重温设计模式 --- 适配器模式

重温设计模式 --- 适配器模式

时间:2023-07-10 20:22:35浏览次数:34  
标签:适配器 ITarget 接口 Adaptee --- 模式 设计模式 public

引言

适配器模式是一种结构型设计模式,用于将一个类的接口转换成另一个接口,以便于两个不兼容的类之间能够协同工作。适配器模式可以被认为是一个桥梁,它可以连接两个不同的接口,从而使得它们可以进行协同工作。

适配器模式通常在两个不兼容的类之间进行转换,这些类可能具有不同的接口,不同的数据类型或不同的方法签名。适配器模式通过将一个类的接口转换为另一个类的接口来解决这个问题,这样这两个不同的类就可以协同工作了。

适配器模式分为两种类型,类适配器模式和对象适配器模式。

  • 类适配器模式:通过多重继承的方式,将适配者类的接口转换为目标接口。

  • 对象适配器模式:通过组合的方式,将适配者类的接口转换为目标接口。

下面我们使用C#来实现适配器模式。

创建目标接口

// 目标接口
public interface ITarget
{
    void Request();
}

创建原有类

// 原有类
public class Adaptee
{
    public void SpecificRequest()
    {
        Console.WriteLine("Adaptee.SpecificRequest");
    }
}

类适配器模式

类适配器模式通过继承实现适配器功能,它继承了原有类并实现了新的接口。这样,客户端就可以通过适配器调用原有类的方法。

  1. 创建类适配器
// 类适配器
public class Adapter : Adaptee, ITarget
{
    public void Request()
    {
        this.SpecificRequest();
    }
}
  1. 创建客户端
// 客户端代码
public class Client
{
    public void DoWork(ITarget target)
    {
        target.Request();
    }
}

可以这样调用:

// 使用类适配器模式
Client client = new Client();

ITarget adapter = new Adapter();

client.DoWork(adapter);

适配器Adapter继承原有类Adaptee,实现了ITarget接口,并在Request方法中调用了基类的SpecificRequest方法,这样客户端就达到了通过适配器调用原有类的方法。

对象适配器模式

对象适配器模式通过组合实现适配器功能,它将原有类的对象作为一个成员变量包含在适配器类中。这样,客户端就可以通过适配器调用原有类的方法。

// 对象适配器
public class Adapter : ITarget 
{
    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee)
    {
        this.adaptee = adaptee;
    }
    
    public void Request() 
    {
        this.adaptee.SpecificRequest();
    }
}
  1. 创建客户端
// 客户端代码
public class Client
{
    public void DoWork(ITarget target)
    {
        target.Request();
    }
}

可以这样调用:

Client client = new Client();

Adaptee adaptee = new Adaptee();

ITarget adapter = new Adapter(adaptee);

client.DoWork(adapter);

适配器Adapter实现了ITarget接口,并持有了原有类的对象作为一个成员变量,使用含参构造的方式将原有类对象初始化,在Request方法中调用了原有类的SpecificRequest方法,这样客户端就达到了通过适配器调用原有类的方法。

结论

如果我们需要在现有代码中添加新的功能,而又不能修改原有的代码,那么适配器模式就是一个非常好的解决方案。适配器模式可以将不兼容的接口转换成兼容的接口,从而让不兼容的代码能够协同工作。

标签:适配器,ITarget,接口,Adaptee,---,模式,设计模式,public
From: https://www.cnblogs.com/pandefu/p/17536306.html

相关文章

  • springcloud -sentinel 用户自定义限流错误处理(仅限限流异常,其他异常请使用fallback属
    pom依赖<!--SpringCloudailibabanacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>......
  • 2023-7-10 #65 我守着虚构的幻想 那些我珍视的模样
    448QOJ6669Mapa这谁想得到啊??????????????????插出一个模1e9+7下的多项式,保存系数。449CF1456EXOR-ranges感觉挺难的。类似406HDU6358Innocence,我们将每一段拆成\(\log\)个trie上的区间,每一个形如“固定前缀\(S\),长为\(l\)的后缀任选”,并将选择\([l,r]\)内的数改为在这\(\l......
  • bean的生命周期--容器关闭操作
         ......
  • pytest + yaml 框架 -49.allure报告自定义内容
    前言v1.4.0版本支持allure报告自定义内容用例添加allure描述用例中可以通过dynamic添加以下内容allure.dynamic.featureallure.dynamic.linkallure.dynamic.issueallure.dynamic.testcaseallure.dynamic.storyallure.dynamic.titleallure.dynamic.description在t......
  • 7-10打卡
    Java方法重载classMathUtils{publicstaticintadd(inta,intb){returna+b;}publicstaticdoubleadd(doublea,doubleb){returna+b;}publicstaticintadd(inta,intb,intc){returna+b+c;......
  • vue(十)Element-plus
    Element-plus基于Vue3,Element-ui基于Vue2,是一套前端页面组件库安装和使用安装npminstallelement-plus--save使用:按需导入,只打包使用到的组件安装插件unplugin-vue-components和unplugin-auto-importnpminstall-Dunplugin-vue-componentsunplugin-aut......
  • 2023-07-10:Kafka如何做到消息不丢失?
    2023-07-10:Kafka如何做到消息不丢失?答案2023-07-10:Kafka采用多种机制来确保消息的不丢失,其中包括副本机制、ISR(In-SyncReplicas)机制以及ACK机制等。1.副本机制Kafka通过副本机制来确保消息不会丢失。在Kafka中,每个分区都可以配置多个副本,每个副本保存分区的完整拷贝。当一个副本宕......
  • 文心一言 VS 讯飞星火 VS chatgpt (57)-- 算法导论6.4 1题
    文心一言VS讯飞星火VSchatgpt(57)--算法导论6.41题一、参照图6-4的方法,说明HEAPSORT在数组A=(5,13,2,25,7,17,20,8,4)上的操作过程。文心一言:下面是HEAPSORT在数组A=(5,13,2,25,7,17,20,8,4)上的操作过程:调用BUILD-MAX-HEAP函数,将数组A转换为最大堆。将堆顶元......
  • openGauss学习笔记-05 openGauss gsql连接与使用方法
    openGauss学习笔记-05openGaussgsql连接与使用方法openGauss提供了在命令行下运行的数据库连接工具gsql。此工具除了具备操作数据库的基本功能,还提供了若干高级特性,便于用户使用。本节主要介绍如何使用gsql本地连接数据库。您需要提供数据库的名称以及数据库主节点的端口号。5.......
  • CF1585F Non-equal Neighbours - 容斥 - dp - 单调栈
    题目链接:https://codeforces.com/problemset/problem/1585/F题解:难难难考虑容斥:设\(A_i\)表示\(b_i\neqb_{i+1}\)(\(i=1,2,\cdots,n-1\))时对应的\(\{b_i\}\)方案的答案那么答案就是$$\bigcap_{{i=1}}^{n}A_{i}=|U|-\left|\bigcup_{i=1}^n\overline{A_i}\right|$$......