我们继续学习设计模式系列文章。
今天我们要学习的是设计模式中的适配器模式,适配器模式其实也比较好理解,光从它的名字我们都能理解个所以然了。
适配器模式定义:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
上面的这段话可能对初学者来说有点抽象,短短的一段话提到了几个关键的技术点。都是一些基本语法,如果我们还没有掌握这些语法最好还是先去解决前提再来攻克设计模式。
那到底啥叫适配器模式,这个“适配”很形象、生动的形容了所表达的意思,那么一般用在什么地方呢?怎么来解决一些接口不兼容的情况下的问题。下面我们就来由浅入深的进行理解、学习。[王清培版权所有,转载请给出署名]
[面向对象编程就是对大自然进行虚拟的、抽象的建模。只要我们结合身边的事物,多思考、多想象,很多东西都能迎刃而解。]
我们还是用问题来作引导,这样便于我们自己开动大脑进行自主的学习。在日常生活中我们经常碰见一些无法直接对接的现象,比如自来水管、竹筒、插座等等。这些东西都会由于两头没有一个标准,导致无法直接连接使用。自来水管从地底下通往各个住户家中,但是不可能几十万的住户用很细的水管吧,必须用很粗的水管进行送水。但是到了住户家中不可能用那么粗的水管使用吧。所以从水厂到我们使用水之间是经历很多环节的适配过程,到了住户家中必须用细的水管进行使用,在送水的过程中必须用很大的水管进行送水。
1:
上图中的每一个画红线的地方都是需要适配的地方,在使用的时候必须进行接口的对接才能使用。
我们都有使用插座的习惯,我们的笔记本假如是两眼插座的,但是插线板只有三眼的,怎么办?难道这个就不能用了吗?当然不是,我们需要一个能对接三眼插座的插线板,这样我们就能使用电脑了。请看图:
2:
这两个例子都说明了适配器的作用。我们不能因为接口不同导致两个工具不能使用起来,就好比图1中的水桶和水厂两个对象。其实这两个对象之间只需要用适配器进行对接一下就能成功的使用。我们来看代码怎么实现。
水厂代码:
代码语言:javascript复制using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
public class 水厂
{
水厂供水接口 符合接口的水管;//水厂只认识该标准的接口
public void 对接(水厂供水接口 接口)
{
符合接口的水管 = 接口;
}
public void 送水()
{
符合接口的水管.送水("送出10吨水");
}
}
}
水厂供水接口代码:
代码语言:javascript复制using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
public interface 水厂供水接口
{
int 水管直径 { get; }
void 送水(string 要送的水);
}
}
各地区水桶代码:
代码语言:javascript复制using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
public class 各地区水桶
{
string 保存水的容器 = string.Empty;
public void 送水来了(string 水)
{
保存水的容器 = 水;
Console.WriteLine("已经收到水厂送来的" 水);
}
}
}
水桶适配器代码:
代码语言:javascript复制using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
public class 水桶适配器 : 水厂供水接口
{
各地区水桶 水桶;
#region 水厂供水接口 成员
public int 水管直径
{
get { return 2; }
}
public void 设置适配对象(各地区水桶 桶)
{
水桶 = 桶;
}
public void 送水(string 要送的水)
{
水桶.送水来了(要送的水);
}
#endregion
}
}
模拟调用代码:
代码语言:javascript复制using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
水厂 shuichang = new 水厂();
各地区水桶 shuitong = new 各地区水桶();
水桶适配器 shuitongadapter = new 水桶适配器();
shuitongadapter.设置适配对象(shuitong);
shuichang.对接(shuitongadapter);
shuichang.送水();
Console.ReadLine();
}
}
}