当前位置: 首页 > news >正文

结构型设计模式

深入理解结构型设计模式:适配器、代理、装饰器模式(C#实例解析)

结构型设计模式专注于类和对象的组合方式,帮助开发者构建灵活、可扩展的软件架构。本文通过实际场景和C#代码示例,详细解析适配器、代理、装饰器三种常用结构型模式。


一、适配器模式(Adapter Pattern)

核心思想

充当两个不兼容接口之间的桥梁,使原本无法协同工作的类能够协同工作。

应用场景

  • 整合第三方库或遗留代码
  • 统一多个类的不一致接口

C#代码示例

// 目标接口(客户端期望的格式)
public interface ILogger
{
    void Log(string message);
}

// 需要适配的类(不兼容接口)
public class FileLogger
{
    public void WriteToFile(string content)
    {
        File.WriteAllText("log.txt", content);
    }
}

// 适配器类
public class FileLoggerAdapter : ILogger
{
    private readonly FileLogger _fileLogger;

    public FileLoggerAdapter(FileLogger fileLogger)//通过构造方法取出FileLogger的实例
    {
        _fileLogger = fileLogger;
    }

    public void Log(string message)
    {
        _fileLogger.WriteToFile($"[{DateTime.Now}] {message}");
    }
}

// 使用示例
var adaptee = new FileLogger();
ILogger logger = new FileLoggerAdapter(adaptee);
logger.Log("System initialized"); // 统一调用Log方法

模式特点

  • 对象适配器:通过组合实现(推荐)
  • 类适配器:通过多继承实现(C#不支持)

二、代理模式(Proxy Pattern)

核心思想

通过代理对象控制对原始对象的访问,实现权限控制、延迟加载等功能。

应用场景

  • 图片/文件延迟加载
  • 访问权限控制
  • 远程方法调用

C#代码示例

// 服务接口
public interface IImageLoader
{
    void DisplayImage();
}

// 真实服务
public class HighResImage : IImageLoader
{
    private readonly string _filename;

    public HighResImage(string filename)
    {
        // 模拟耗时加载
        Thread.Sleep(2000);
        _filename = filename;
    }

    public void DisplayImage()
    {
        Console.WriteLine($"Displaying {_filename}");
    }
}

// 代理类
public class ImageProxy : IImageLoader
{
    private HighResImage _realImage;
    private readonly string _filename;

    public ImageProxy(string filename)
    {
        _filename = filename;
    }

    public void DisplayImage()
    {
        _realImage ??= new HighResImage(_filename); // 延迟加载
        _realImage.DisplayImage();
    }
}

// 使用示例
IImageLoader image = new ImageProxy("photo.jpg");
// 真实对象尚未创建
image.DisplayImage(); // 此时才加载真实图片

代理类型

  • 虚拟代理:延迟创建开销大的对象
  • 保护代理:控制访问权限
  • 远程代理:本地代表远程对象

三、装饰器模式(Decorator Pattern)

核心思想

动态地为对象添加新功能,相比继承更加灵活。

应用场景

  • 为对象动态添加功能
  • 避免使用子类进行功能扩展

C#代码示例

// 组件接口
public abstract class Coffee
{
    public abstract string GetDescription();
    public abstract double GetCost();
}

// 具体组件
public class SimpleCoffee : Coffee
{
    public override string GetDescription() => "Simple Coffee";
    public override double GetCost() => 1.0;
}

// 装饰器基类
public abstract class CoffeeDecorator : Coffee
{
    protected Coffee _decoratedCoffee;

    protected CoffeeDecorator(Coffee coffee)
    {
        _decoratedCoffee = coffee;
    }
}

// 具体装饰器
public class MilkDecorator : CoffeeDecorator
{
    public MilkDecorator(Coffee coffee) : base(coffee) {}

    public override string GetDescription() => 
        _decoratedCoffee.GetDescription() + ", Milk";

    public override double GetCost() => 
        _decoratedCoffee.GetCost() + 0.5;
}

// 使用示例
Coffee order = new SimpleCoffee();
order = new MilkDecorator(order); // 加牛奶
order = new MilkDecorator(order); // 再加一份牛奶

Console.WriteLine($"{order.GetDescription()} - ${order.GetCost()}");
// 输出:Simple Coffee, Milk, Milk - $2.0

模式特点

  • 保持开放-封闭原则
  • 多层装饰可叠加功能
  • 避免类爆炸问题

模式对比

模式核心目的关键区别
适配器接口转换解决兼容性问题
代理访问控制保持接口一致性
装饰器功能扩展动态添加职责

总结

结构型设计模式通过巧妙的组合方式提升系统灵活性:

  • 适配器解决接口不匹配问题
  • 代理优化对象访问控制
  • 装饰器实现动态功能扩展

相关文章:

  • Linux cma预留内存使用与理解
  • “产业大数据”区域产业经济发展的新引擎!
  • dbeaver连接mongodb 插入日期变成了字符串
  • 希尔排序:算法原理与应用解析
  • 云端存储新纪元:SAN架构驱动的智能网盘解决方案
  • 机器学习实战之数据预处理、监督算法、无监督算法、模型评估与改进-思维导图拆分篇
  • Verilog 中寄存器类型(reg)与线网类型(wire)的区别
  • leetcode 2255. 统计是给定字符串前缀的字符串数目 简单
  • flutter-实现瀑布流布局及下拉刷新上拉加载更多
  • 详解java体系实用知识总结
  • 创新前沿 | 接管主机即刻增量CDP备份,高效保障接管期间业务安全!
  • 工业4G路由器赋能智慧停车场高效管理
  • 基于Linux下的MyBash命令解释器
  • 【13】Ajax爬取案例实战
  • 通过Docker快速搭建VoceChat | 开源轻量自托管聊天工具
  • 基于Spring Boot的网上商城系统的设计与实现(LW+源码+讲解)
  • 213.SpringSecurity:授权,授权实战,OAuth2,SpringSecurity中OAuth2认证服务器、资源服务器搭建,JWT
  • Oracle 19C 备份
  • vue3中<script setup>语法糖是什么意思。为什么叫语法糖,为什么叫糖,它甜吗
  • vue2前端日志数据存储(indexedD)自动清理3天前的数据
  • 济南高新区一季度GDP增长8.5%,第二产业增加值同比增长14.4%
  • 海量数据处于“原矿”状态,数据价值释放如何破局?
  • “光荣之城”2025上海红色文化季启动,红色主题市集亮相
  • 东风着陆场做好各项搜救准备,迎接神舟十九号航天员天外归来
  • 中使馆:奉劝菲方有关人士不要在台湾问题上挑衅,玩火者必自焚
  • 葡萄牙、西班牙突发大范围停电,交通和通信服务受到严重影响