c#设计模式-结构型模式 之适配器模式

2023-09-21 22:29:33

🚀介绍

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能 一起工作。
适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现 有组件库中的相关组件的内部结构,所以应用相对较少些。

适配器模式(Adapter)包含以下主要角色:

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者

🚀案例

适配者Adaptee(已经存在,与接口不兼容的类),他有一个SpecificRequest(特殊请求)方法

class Adaptee
{
    public void SpecificRequest()
    {
        Console.WriteLine("Called SpecificRequest()");
    }
}

我们的目标接口Taget(切口中定义了一个请求方法

interface ITarget
{
    void Request();
}

适配器Adapter,在Adapter中,实现了我们的接口,但是实际上是调用了AdapteeSpecificRequest方法

class Adapter : ITarget
{
    private readonly Adaptee _adaptee;

    public Adapter(Adaptee adaptee)
    {
        _adaptee = adaptee;
    }

    public void Request()
    {
        _adaptee.SpecificRequest();
    }
}

然后!我们就可以通过ITarget接口来使用AdapteeSpecificRequest方法了

    public static void Main(string[] args)
    {
        ITarget target = new Adapter(new Adaptee());
        target.Request();
    }

🚀优缺点

优点:

  1. 提高了类的复用性:适配器模式可以让两个没有任何关系的类一起运行。
  2. 增加了类的透明性:用户通过适配器可以调用目标接口,适配器对用户来说是透明的,用户并不需要知道适配器的存在。
  3. 提高了类的扩展性:如果想要替换或者增加被适配的类,只需要修改适配器或者增加新的适配器即可,原有代码无需修改,符合“开闭原则”。
  4. 灵活性好:适配器模式提供了一种“即插即用”的方式来适应业务变化,可以很方便地改变数据和对象的表现形式。

缺点:

  1. 过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明可以直接调用的函数,却非要在使用一个适配器,这无疑增加了系统的复杂度。

使用场景:

  1. 系统需要使用现有的类,而这些类的接口不符合系统的需要。
  2. 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
  3. 需要一个统一的输出接口,而输入端的类型不可预知。
更多推荐

计算机专业毕业设计项目推荐06-工作室管理系统(Java+Vue+Mysql)

工作室管理系统(JavaSpring+Vue+Mysql)**介绍****系统总体开发情况-功能模块****各部分模块实现****最后想说的****联系方式**介绍本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式,在

云计算的未来:云原生架构和自动化运维的崭露头角

文章目录云计算的演进云原生架构1.容器化2.微服务3.自动化部署和扩展4.故障恢复自动化运维1.基础设施即代码(IaC)2.运维自动化示例:使用Ansible自动化配置管理3.自动化监控和报警未来展望1.更多的自动化2.多云混合云3.边缘计算4.安全性结论🎉欢迎来到云计算技术应用专栏~云计算的未来:云原生架构和自动化

自动化发布npm包小记

1.注册npm账号打开npm官网,并注册自己的npm账号2.申请AccessToken1.登录npm官网,登录成功后,点开右上角头像,并点击AccessTokens选项2.点开GenerateNewToken下拉框,点击ClassicToken(和GranularAccessToken有什么区别,请自行查验?)3.填写

WPF行为

行为是一款重用用户界面代码的更有挑战性的工具。其基本思想是:使用行为封装一些通用UI功能。如果具有适当的行为,可使用一两行XAML标记将其附加到任意元素,从而节省编写和调试代码的工作。样式提供了重用一组属性设置的实用方法。它们帮助构建一致的、组织良好的界面迈出了重要的第一步——但它们还有许多限制。问题是在典型的应用程序

多级缓存基础架构组件设计

基础架构组件-缓存背景目的缓存架构服务层多级缓存核心流程设计1、缓存介质2、如何实现spring注解方式多级缓存如何实现缓存的永久存储又可以过期刷新,而避免缓存失效带来的一系列缓存雪崩、击穿等问题实现缓存包装类多级缓存处理器实现1、lookup(Objectkey)2、get(Objectkey)3、重头戏get(Ob

Lua 多返回值

Lua这门神奇的语言可以在函数里面返回多个值具体函数如下functionmulti_return()return2,"hellowworld"endlocala,b=multi_return();--多个都返回print(a,b)localm=multi_return();--默认返回第一个返回值print(m)unp

搭建Flink集群、集群HA高可用以及配置历史服务器

Flink集群搭建Flink集群搭建集群规划下载并解压安装包修改集群配置分发安装目录启动集群访问WebUIFlink集群HA高可用概述集群规划配置flink配置master、workers配置ZK分发安装目录启动HA集群测试Flink参数配置配置历史服务器概述配置启动、停止历史服务器提交一个Job任务查看历史Job信息

数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释

文章目录单链表的基本操作实现1.头文件2.类定义和多种算法的实现2.1创建空表2.2头插法创建n个元素的线性链表2.3一个带头节点的链表存放一组整数,设计一个算法删除值等于x的所有节点。2.4计算线性表中值为偶数的节点个数2.5一个带头节点的单链表heada存放一组整数,设计分裂heada算法,偶数放在heada中,奇

二叉树的概念、存储及遍历

一、二叉树的概念1、二叉树的定义二叉树(binarytree)是n个结点的有限集合,该集合或为空集(空二叉树),或由一个根结点与两棵互不相交的,称为根结点的左子树、右子树的二叉树构成。二叉树的特点是:(1)每个结点最多有两棵子树,故二叉树中不存在度大于2的结点。(2)二叉树是有序的,其次序不能任意颠倒,即使树中的某个结

利用Socks5代理IP加强跨界电商爬虫的网络安全

随着跨界电商的兴起,爬虫技术在这个领域变得越来越重要。然而,网络安全一直是一个值得关注的问题。在本文中,我们将讨论如何利用代理IP和Socks5代理来增强跨界电商爬虫的网络安全,确保稳定和可靠的数据采集,同时避免封禁和风险。背景跨界电商是一个竞争激烈的领域,市场上的商品信息和价格常常会变动。为了保持竞争力,电商企业需要

CFGPT: Chinese Financial Assistant with Large Language Model

本文是LLM系列文章,针对《CFGPT:ChineseFinancialAssistantwithLargeLanguageModel》的翻译。CFGPT:大型语言模型的中文财务助理摘要1引言2相关工作3数据集4模型和训练5应用6结论摘要大型语言模型(LLM)在金融领域的自然语言处理任务中显示出巨大的潜力。在这项工作中

热文推荐