尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

设计模式系列-适配器模式一、上篇回顾

设计模式系列-适配器模式一、上篇回顾
📅 发布时间:2026/7/5 3:32:09

通过上篇的简单讲解,我们知道了,组合模式意图是通过整体与局部之间的关系,通过树形结构的形式进行组织复杂对象,屏蔽对象内部的细节,对

外展现统一的方式来操作对象,是我们处理更复杂对象的一个手段和方式。本文以查询控件为例,说明了,查询控件内部的组成元素,及如何操作内部的组

成元素,包括添加元素,删除和处理相应事件的Handler,当然组合模式的作用远比这些强大,后面我们肯定会在一些实例代码中运用到组合模式的。组合

模式如果在条件允许的情况下,我们尽量使用组合模式来处理复杂对象,远比通过继承出来的对象来的有效。

组合模式-强调的是如何组织整体和局部之间的结构,将整体和局部之间的关系,通过树形这样的结构来组织这种对象组合的结构关系。

组合模式的适用场景:

1、我们期望操作一个复杂对象和操作一个组成这个复杂对象内部的简单对象一样操作的时候,我们可以考虑对象组合。

2、当一个对象由多个简单对象组成,并且它又可能是其他对象的一个组成部分,这种情况下,组合模式是比较好的选择。

二、摘要

本篇将会讲述结构型模式中的经典模式-适配器模式,也是项目中经常使用的模式之一,我们现在开发一个系统的时候,也许会遇到各式各样的要求,我们要求和现有的系统

进行集成,或者是我们直接开发一个系统,或者是我们修改已有的系统达到满足现有需求的要求。因此一般来说,每种情况,我们都有自己的应对方案。我们来看看项目中的几种

可能情况:

​编辑

通过上面的几种情况,我们知道,开发一个新系统吧,成本和时间的投入较高,如果说我们旧系统目前运行的非常稳定,并且投入的成本非常高,我们既想继续使用旧系统的功

能,又想满足新系统的需求,这个时候,我们怎么做呢?可能比较好的方式就是把旧系统通过适配器来转换成新接口的调用形式,完成适配服务。当然本文也是主要针对这个思

路,展开去讲述适配器模式的一些用法,当然我这里可能讲解了适配器模式的一些普遍用法,还有一些比较特殊的用法,需要大家多多指出,向大伙学习了。

本文主要讲述下面的几个部分的内容:

1、适配器模式的使用场景。

2、适配器模式的经典实现。

3、多适配器的封装。

4、其他情况的考虑。

三、本文大纲

a、上篇回顾。

b、摘要。

c、本文大纲。

d、适配器模式的特点及使用场景。

e、适配器模式的经典实现。

f、适配器模式的其他方案。

g、适配器模式使用总结。

h、系列进度。

i、下篇预告。

四、适配器模式的特点及使用场景

4.1、适配器模式的特点

适配器模式主要解决的问题就是我们要调用的接口类型,无法满足我们新系统的使用需求,这时候,我们需要将旧系统的接口,通过适配器进行转配,达到支持新接口调用

的目的。对于这样的要求,我们通过适配器就可以完成,当然如果有多个接口需要转配,那么我们就需要为每一个接口提供一个适配器去完成转换的工作。当然具体的调用过程,

我们可以进行相应的封装。达到比较通用的方式去调用适配器,完成适配服务。我们来看看适配的过程。

​编辑上图基本给出了适配器的基本转换的过程。

4.2、适配器模式的场景

我们根据上面的适配器的特点的介绍中,我们来分析下适配器模式的几类比较适用的使用场景:

1、我们在使用第三方的类库,或者说第三方的API的时候,我们通过适配器转换来满足现有系统的使用需求。

2、我们的旧系统与新系统进行集成的时候,我们发现旧系统的数据无法满足新系统的需求,那么这个时候,我们可能需要适配器,完成调用需求。

3、我们在使用不同数据库之间进行数据同步。(我这里只是分析的是通过程序来说实现的时候的情况。还有其他的很多种方式[数据库同步])。

五、适配器模式的经典实现

我们本节给出适配器模式的经典实现代码,我们这里结合项目中的查询服务来进行说明,旧系统中提供一个查询服务方法Query();但是我新系统定义底层的数据访问服务层

的时候,却是使用的GetList()方法,并且将之前的返回结果集合进行包装成泛型的形式来进行。我们这里给出相关的示例代码,大家就能清楚这个使用过程了,当然我们这里给

出类适配器和对象适配器2种实现的方式,通过不同的实现思路,我们最后总结下,这2种形式的优缺点:

1、类适配器

针对上面描述的接口的转配过程,我们给出示例代码:

旧系统的查询服务

public class Query :IQuery
{
public object Query()
{
return new object();
}
}

新系统的查询服务接口:

public interface ISelect
{
object GetList();
}

通过类适配器完成转配操作:

public class QueryAdapter : Query, ISelect
{
public object GetList()
{
return base.Query();
}
}

具体的调用测试代码如下:

class Program
{
static void Main(string[] args)
{
ISelect adapter = new QueryAdapter();

object o= adapter.GetList();

System.Threading.Thread.Sleep(10000);

}
}

2、对象适配器

旧系统的查询服务

public class Query :IQuery
{
public object Query()
{
return new object();
}
}

新系统的查询服务接口:

public interface ISelect
{
object GetList();
}

通过类适配器完成转配操作:

public class QueryAdapter : ISelect
{
private Query query = new Query();

public object GetList()
{
return query.Query();
}

}

具体的调用测试代码如下:

class Program
{
static void Main(string[] args)
{
ISelect adapter = new QueryAdapter();

object o= adapter.GetList();

System.Threading.Thread.Sleep(10000);

}
}

上面我们就完成了经典的适配器模式的简单实现,当然上面也没有考虑通用性等各方面的内容,只是给出了一个大概的实现,当然对于上面的适配器的创建过程,我们可以通过前

面讲述的创建型模式中的几个实现方案,进行相应的改进。

六、适配器模式的其他方案

上面给出了适配器模式的经典实现,参考其他篇讲述的方式,我们给出适配器模式的其他演变方式

6.1、批量适配器的封装

我们在项目中,可能需要对一批的旧系统的接口进行封装,这个时候我们可以通过配置文件的方式配置适配器。

例如我们上面的查询,可能我现在对于XML文件的查询方法与数据库的查询方法2个旧的查询服务进行封装,然后我在实际的项目中,通过配置来选择我使用哪个查询方法

完成查询服务,通过传入参数,或者是配置节信息来进行控制。我们来看看相关的示例代码:

旧系统定义的查询服务接口:

public interface IQuery
{
object Query();
}

XML查询和数据库方式的实现:

public class XMLQuery : IQuery
{
public object Query()
{
throw new NotImplementedException();
}
}

public class DbQuery : IQuery
{
public object Query()
{
throw new NotImplementedException();
}
}

新查询服务接口:

public interface ISelect
{
object GetList();
}

具体的适配器代码实现:

public class XMLAdapter : ISelect
{
private XMLQuery query = new XMLQuery();
public object GetList()
{
return query.Query();
}
}

public class DbAdapter : ISelect
{
private DbQuery query = new DbQuery();
public object GetList()
{
return query.Query();
}
}

工厂来负责创建旧系统接口的服务的对象。

public class AdapterFactory
{
public static ISelect CreateAdapter()
{
return (ISelect)Activator.CreateInstance(Type.GetType(""));
}
}

具体的调用测试代码:

class Program
{
static void Main(string[] args)
{
ISelect select = AdapterFactory.CreateAdapter();

object o= select.GetList();
}
}

6.2、通用适配器

旧系统定义的查询服务接口:

public interface IQuery
{
object Query();
}

XML查询和数据库方式的实现:

public class XMLQuery : IQuery
{
public object Query()
{
throw new NotImplementedException();
}
}

public class DbQuery : IQuery
{
public object Query()
{
throw new NotImplementedException();
}
}

工厂来负责创建旧系统接口的服务的对象。

public class OldFactory
{
public static IQuery CreateQuery()
{
return (IQuery)Activator.CreateInstance(Type.GetType(""));
}
}

新查询服务接口:

public interface ISelect
{
object GetList();
}

具体的通用适配器代码实现:

public class ComAdapter : ISelect
{
IQuery query = OldFactory.CreateQuery();

public object GetList()
{
return query.Query();
}

相关新闻

  • 为什么合规三证仪器稳定性参差不齐?原来是这些因素在作祟!
  • 海水环境防腐优选,锌合金牺牲阳极优势盘点
  • OpenAI Python库是什么?一文看懂通用大模型统一调用标准

最新新闻

  • 第三方平台信息不一致,企业说明材料该怎么写才稳?
  • OpenCV+YOLO实战:快速搭建机器人视觉感知系统
  • Cypress vs Playwright:端到端测试框架实战选型与迁移指南
  • Yale OpenHand:重新定义机器人抓取的开源硬件革命
  • 开题写作告别反复改稿,okbiye 一站式 AI 开题功能打通科研起步全流程
  • 从Prompt到自动化:Loop Engineering构建AI Agent自主工作流

日新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号