惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog

博客园 - 侯垒

中转站余额为什么掉得快?我拆了一次 AI 编程任务的真实消耗 我让 Claude 写了一个贪吃蛇游戏,然后用 ccglass 看清它发给模型的真实请求 AI 编程 Agent 不是黑箱了:用 ccglass 看清 Claude Code 和 Codex 的真实请求 软件工程--软件过程模型 UML 类图 WebService基于SoapHeader实现安全认证 (转)深入理解Javascript闭包(closure) 数据库中使用自增量字段与Guid字段作主键的性能对比(补充篇) SQL Server 查询处理中的各个阶段 敏捷软件开发--敏捷宣言 asp.net抛出System.Data.OleDb.OleDbException:未指定的错误 架构师 通用的数据库操作类(支持多种数据库) 数据库中使用自增量字段与Guid字段作主键的性能对比 将GridView中的数据导出到Excel中下载并且解决乱码的问题 设计模式----建造者模式(Builder Pattern) 大学生联盟开发团队需要我们共同的努力 - 侯垒 - 博客园 SQL 数据库操作类 只启动一个窗体,如果再次启动则激活该窗体 如何将自己的代码自动添加版权信息的及其扩展 如何将自己的代码自动添加版权信息 设计模式-----桥接模式(Bridge Pattern)
轻松学习适配器模式(Adapter Pattern)
侯垒 · 2008-03-04 · via 博客园 - 侯垒

           
                   适配器模式(Adapter Pattern)

  
以下内容是我和小组的兄弟学习设计模式我做的课件,我整理出来和大家分享,有不妥之处敬请指出.
 上次做的桥接模式(Bridge),这次是适配器模式(Adapter).
概述:
      在软件开发过程中,我们要经常要复用我们以前开发的一些“现存对象”,但是这些“现存对象”并不能满足我们新的应用环境。怎样才能良好的复用这些对象,以满足我们的应用环境,这就是适配器(Adapter)所要解决的问题。意图:
   将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
                                                                                                        ——《设计模式》GOF
生活中的例子:
      在现实生活中,像这种适配器我们经常见到,而且还是经常使用它,如:手机(深信大家都见过),我们手机在充电的时候,不可能直接在220V电源上直接充电,而是手机“充电器”进行转换成手机需要的电压才可以正常充电,否则就不可以完成充电,这个“充电器”就起到了适配的作用。

1.类的Adapter模式结构图
               
类结构图:
                       
代码实现:

 1namespace Adapter_Pattern
 2{
 3    public interface ITarget
 4    {
 5        void GetPower();
 6    }

 7    /// <summary>
 8    /// 220V电源类;
 9    /// </summary>

10    public class Power
11    {
12        /// <summary>
13        /// 从电源中得到220V的电压;
14        /// </summary>

15        public void GetPoer220V()
16        {
17
18        }

19    }

20    /// <summary>
21    /// 适配器类(充电器);
22    /// </summary>

23    public class Adapter : Power, ITarget
24    {
25        /// <summary>
26        /// 得到想要电压;
27        /// </summary>

28        public void GetPower()
29        {
30            this.GetPoer220V();
31            Console.WriteLine("得到手机的充电电压");
32        }

33    }

客户端调用:

 1namespace Adapter_Pattern
 2{
 3    class Program
 4    {
 5        /// <summary>
 6        /// 这里相当于是手机;
 7        /// </summary>
 8        /// <param name="args"></param>

 9        static void Main(string[] args)
10        {
11            Console.Write("手机:");
12            ITarget Target = new Adapter();
13            Target.GetPower();
14            Console.Read();
15        }

16    }

17}


特点:
  它使用多继承的方式来实现,我们只需要调用得到电压(GetPower())方法,由充电器(Adapter)去将220V的电压转成我们需要的电压供我们使用。
2.对象的Adapter模式结构图
                   
类结构图:
                       
代码实现:

 1namespace Adapter_Pattern_Object_
 2{
 3    public interface ITarget
 4    {
 5        void GetPower();
 6    }

 7    /// <summary>
 8    /// 220V电源类
 9    /// </summary>

10    public class Power
11    {
12        /// <summary>
13        /// 得到220V电压;
14        /// </summary>

15        public void GetPoer220V()
16        {
17            //在这是220V的电压;
18        }

19    }

20    /// <summary>
21    /// 适配器类(充电器)
22    /// </summary>

23    public class Adapter : ITarget
24    {
25        Power power;
26        /// <summary>
27        /// 适配器的构造函数;
28        /// </summary>
29        /// <param name="power">要适配的电压</param>

30        public Adapter(Power power)
31        {
32            this.power = power;
33        }

34        /// <summary>
35        /// 得到想要的电压;
36        /// </summary>

37        public void GetPower()
38        {
39            power.GetPoer220V();
40            Console.WriteLine("得到手机的充电电压!");
41        }

42    }

43}

44


客户端调用:

 1namespace Adapter_Pattern_Object_
 2{
 3    class Program
 4    {
 5        /// <summary>
 6        /// 这里相当于手机;
 7        /// </summary>
 8        /// <param name="args"></param>

 9        static void Main(string[] args)
10        {
11            Console.Write("手机:");
12
13            Power power=new Power();
14            ITarget Target = new Adapter(power);
15            Target.GetPower();
16
17            Console.Read();
18        }

19    }

20}


总结:

  对于此例子,我们要对手机充电,电力部门不可能给我们提供我们需要的电压,有时候也不一定满足我们的需要,这个就是要我们自己进行转换,这就用到适配器(Adapter)。
  对软件系统中,如果要复用以前的“现存对象”,但是这些对象所提供的接口并不一定能适应我们的新环境,我们就要对其转换成我们需要的接口,来供我们调用。

Adapter在.NET中的应用:

  在ADO.NET中,对于我们从数据库中取出的数据都要放到一个DataSet中,不管你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中。.NET中并没有提供如:SqlDataSet、OleDbDataSet、OracleDataSet等,它只提供了一种DataSet就是用SqlDataAdapte等去填充数据;为什么这一个DataSet能存放不同的数据呢?就是有这些适配器来适配。
DataAdapter结构图:
                            
要点:
1.Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
2.Adapter模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
适用性:
 在以下各种情况下使用适配器模式:
1.系统需要使用现有的类,而此类的接口不符合系统的需要。
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3.(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
总结:
  总之,通过运用Adapter模式,就可以充分享受进行类库迁移、类库重用所带来的乐趣,以达到更好的复用。

       示例源码下载