首页 > 编程语言 >C# 设计模式:适配器模式(Adapter Pattern)

C# 设计模式:适配器模式(Adapter Pattern)

时间:2024-09-15 17:22:52浏览次数:3  
标签:C# 适配器 接口 int void 日志 设计模式 public

摘要


适配器模式是一种结构型设计模式,它允许不兼容的接口之间能够相互合作。这种模式涉及到一个单独的类,它负责加入独立的或不兼容的接口功能。简单来说,适配器模式就是一个中间件,它使得原本由于接口不兼容而不能一起工作的类可以一起工作。

正文


C# 设计模式:适配器模式(Adapter Pattern)_C#


应用场景

适配器模式通常应用于以下情况:

  • 当你希望使用某个类,但是它的接口与其他代码不兼容时。
  • 当你想创建一个可重用的类,该类可以与未知的或未来的类(即那些接口可能不兼容的类)协同工作。
  • 当你需要使用几个现有的子类,但是子类化每个类以适配它们的接口会导致代码可复用性降低时。

优势

  • 提高类的复用性:通过适配器,可以使原本因接口不兼容而不能一起工作的类可以一起工作。
  • 增加了类的透明性和灵活性:隐藏了具体实现,用户只需要关注接口。
  • 系统的可扩展性较好:在实现新的适配器时,不必修改原有代码,符合开闭原则。

劣势

  • 过多的使用适配器会使系统非常凌乱:不仅会产生很多小类,而且在维护时可能会造成困难。
  • 不易于理解:尤其是涉及到多重适配时,适配器的引入可能会让系统的复杂性大大增加。

例子1:电源适配器

想象一下,我们有一个IUSPowerSource美国电源接口,它提供110V电压,而我们有一个设备是IEUPowerDevice欧洲设备,它需要220V电压。为了让这个设备在美国使用,我们需要一个适配器。

首先,我们定义两个接口:

public interface IUSPowerSource
{
    int Provide110V();
}


public interface IEUPowerDevice
{
    void PowerOn(int voltage);
}

两个类

public class EUPowerDevice : IEUPowerDevice
{
    public void PowerOn(int voltage)
    {
        MessageBox.Show(voltage.ToString());
    }
}


public class USPowerSource : IUSPowerSource
{
    public int Provide110V()
    {
        return 110;
    }
}

然后,我们实现一个适配器:

public class PowerAdapter: IUSPowerSource
{
    private IEUPowerDevice _device;


    public PowerAdapter(IEUPowerDevice device)
    {
        _device = device;
    }


    public int Provide110V()
    {
        // 适配器逻辑,将110V转换为220V
        int voltage110 = 110;
        int voltage220 = Convert110VTo220V(voltage110);
        _device.PowerOn(voltage220);
        return voltage110;
    }


    private int Convert110VTo220V(int voltage110)
    {
        // 假设这里有复杂的转换逻辑
        return voltage110 * 2;
    }


}

最后,使用适配器让欧洲设备在美国电源上工作:

private void btnConvert_Click(object sender, EventArgs e)
{
    IEUPowerDevice europeanDevice = new EUPowerDevice();
    IUSPowerSource adapter = new PowerAdapter(europeanDevice);
    var ret = adapter.Provide110V(); // 设备可以在110V电源上工作了 
}

C# 设计模式:适配器模式(Adapter Pattern)_Adapter Pattern_02

例子2:日志系统适配器

假设你有一个老旧的日志系统,它只支持输出日志到控制台,但是现在需要将日志输出到文件中。我们可以通过适配器模式来实现这一需求,而不是修改原有的日志系统。

首先,定义日志接口:

public interface ILogger
{
    void Log(string message);
}

旧的日志系统实现:

public class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine("Log to console: " + message);
    }
}

现在,我们需要一个适配器来实现文件日志功能:

public class FileLoggerAdapter : ILogger
{
    private FileLogger _fileLogger;


    public FileLoggerAdapter(FileLogger fileLogger)
    {
        _fileLogger = fileLogger;
    }


    public void Log(string message)
    {
        _fileLogger.WriteToFile(message);
    }
}


public class FileLogger
{
    public void WriteToFile(string message)
    {
        // 实现将消息写入文件的逻辑
    }
}

使用适配器输出日志到文件:

ILogger logger = new FileLoggerAdapter(new FileLogger());
logger.Log("This is a log message."); // 现在日志被写入到文件中

C# 设计模式:适配器模式(Adapter Pattern)_设计模式_03

标签:C#,适配器,接口,int,void,日志,设计模式,public
From: https://blog.51cto.com/u_9849794/12024787

相关文章

  • c++走出迷宫改良版2
    本文对上期做了删改话不多说上代码:注彩色输出部分代码出自博主夜若渊#include<bits/stdc++.h>#include<windows.h>#include<stdlib.h>#include<cstdio>#include<iostream>#include<string>#include<stdio.h>#include<ctime>#include<conio.h&g......
  • VPS Ubuntu22.04 安装WordPress 搭建网站 详细全流程(基于Apache+MySQL+PHP)(二)
    VPSUbuntu22.04安装WordPress搭建网站详细全流程(基于Apache+MySQL+PHP)(二)简介在网站处理和网络管理方面,WordPress是用户可以采取的最明智的选择。由于WordPress的巨大优势,它在网页设计师中广受欢迎。统计数据显示,访问量最大的1000个网站中约有35%是WordPress。......
  • JavaScript DOM
    一、DOM简介1、简介​DocumentObjectModel文档对象模型​浏览器加载HTML文档时,会将HTML文档解析为一个树形结构,称为DOM树HTML文档和DOM树是一一对应的关系当DOM树被改变时,与之对应的HTML文档也会随之改变当需要对HTML中的内容进行动态改变时,可以使用DOM来进行操作DOM......
  • YOLOv8改进 | 融合改进 | C2f融合重写星辰网络⭐以及CAA【二次融合 +​ CVPR2024】
      秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转......
  • 如何正确配置帝国CMS的数据库连接?
    正确配置帝国CMS的数据库连接涉及到几个步骤,确保帝国CMS能够成功连接到MySQL数据库。以下是配置的基本步骤:找到数据库配置文件:在帝国CMS的安装目录中找到配置文件。对于帝国CMS7.0及以后版本,数据库配置文件通常位于/e/config/config.php。编辑数据库连接信息:打开confi......
  • 帝国CMS数据库数据表详细说明,每个表对应的数据功能说明
    帝国CMS(EmpireCMS,简称ECMS)使用多个数据表来存储不同的信息。下面是一些常见的数据表及其功能说明:phome_ecms_news_doc_data:这是一个新闻归档数据副表,用于存储新闻的相关数据,如新闻的内容、作者等信息。phome_enewsad:广告数据表,用于存储广告信息,例如广告的图片链接、跳......
  • 帝国CMS的多数据库配置
    帝国CMS支持多数据库配置,这对于需要在同一个应用程序中处理多个数据源的情况非常有用。多数据库配置可以让你在一个帝国CMS项目中操作多个数据库,每个数据库可以有自己的配置信息。下面是关于如何配置帝国CMS以支持多数据库的一些建议:修改配置文件:配置文件通常位于/e/config/c......
  • 496. 下一个更大元素 I(leetcode)
    https://leetcode.cn/problems/next-greater-element-i/description/根据校验nums2中的元素是否存在于nums1中的时机分为不同做法classSolution{publicint[]nextGreaterElement(int[]nums1,int[]nums2){Deque<Integer>st=newArrayDeque<>();......
  • java常见设计模式
      Java设计模式是经过验证的、用于解决常见软件设计问题的标准化解决方案。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。以下列出一些常见的设计模式,并附上每个模式的简单说明和Java示例。 1.单例模式(SingletonPattern)-创建型模式目的......
  • dedecms备份数据库文件在哪里
    DEDECMS备份数据库文件通常保存在一个特定的目录中。以下是DEDECMS数据库备份文件的一般位置:备份目录:备份文件通常保存在/data/backupdata目录中。如何找到备份文件通过FTP客户端访问:使用FTP客户端(如FileZilla、WinSCP等)连接到你的服务器或虚拟主机。寻找DEDECMS的安装......