适配器模式
一、完成者信息:
姓名:赖春林
学号:07770110
二、模式信息
1、模式名称:适配器模式
2、模式概述:
在现实生活中往往会遇到这样的问题:很多设备需要使用同一种资源,但每一种设备使用这种资源时都需要特定的接口,这些接口都不一样。现在的问题是怎样实现在没有对应接口的情况下也使设备能够使用呢?这时就可以用到适配器模式。
3、定义:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
4生活场景:
现在有摩托罗拉手机、诺基亚手机和诺基亚充电器。诺基亚充电器只能充诺基亚手机,摩托罗拉手机此时没电了,那如何实现用诺基亚充电器来给摩托罗拉手机充电呢?
终极目标:用诺基亚充电器给摩托罗拉手机充电。
4.1. 不假思索的思路:
既然两种充电器都使用充电这个方法,只不过充电的方式不一样,那何不将这些方法抽象出一个接口来呢? 实现如下:
通过这个类图似乎这样处理根本就没问题,但现在的问题是motolola厂家生产的充电器里不可能有nokia的充电方法,nokia生产的充电器也没有motolola的充电方法。显然这种思路行不通。那该怎么办呢?这时用到适配器模式,添加一个适配器让现有的诺基亚充电器能够给摩托罗拉充电。
4.2. 归纳阶段
对象适配器模式的结构中包块三种角色。
● 目标(Target):目标是一个接口,该接口是客户想使用的接口。
● 被适配者(Adaptee):被适配者是一个已经存在的接口或抽象类,这个接口或抽象类需要适配。
● 适配器(Adapter):适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配器的职责是对被适配者接口(抽象类)与目标接口进行适配。
上例中motolola充电器是目标、nokia充电器是被适配者、接下来需要定义一个适配器。
结构图为:
实现代码如下:
目标(Target)
public interface motololaCharge
{
void mCharge();
}
被适配者(Adaptee)
public interface nokiaCharge
{
void ncharge();
}
适配器(Adapter)
public class Adapter:nokiaCharge
{
motololaCharge motolola;
public Adapter(motololaCharge motolola)
{
this.motolola = motolola;
}
public void ncharge()
{
motolola.mCharge();
}
}
其他
public class motolola:motololaCharge
{
public string name;
public motolola(string s)
{
name = s;
}
public void mCharge()
{
Console.WriteLine(name+"正在充电");
}
}
class nokia:nokiaCharge
{
public string name;
public nokia(string s)
{
name = s;
}
public void ncharge()
{
Console.WriteLine(name+"正在充电");
}
}
public class Program
{
static void Main(string[] args)
{
nokiaCharge nokia;
nokia nk = new nokia("N95");
nokia = nk;
Console.WriteLine("使用nokia充电器");
nokia.ncharge();
motolola motolola = new motolola("motolola");
Adapter adapter=new Adapter(motolola);
nokia = adapter;
Console.WriteLine("使用nokia充电器");
nokia.ncharge();
Console.ReadLine();
}
}
5、验证阶段:
当前目标: 用nokia的充电器给三星手机充电
结果为:添加一个三星到诺基亚的适配器即可。
实现如下:
public class sanxing:sanxingCharge
{
public string name;
public sanxing(string s)
{
name = s;
}
public void mCharge()
{
Console.WriteLine(name+"正在充电");
}
}
public class Adapter:nokiaCharge
{
sanxingCharge sanxing;
public Adapter(sanxingCharge sanxing)
{
this.sanxing = sanxing;
}
public void ncharge()
{
sanxing.mCharge();
}
}
其他代码同上
6、抽象阶段:
实现要点:
1.Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
2.Adapter模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
3.Adapter模式的实现可以非常的灵活,不必拘泥于GOF23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。
4.Adapter模式本身要求我们尽可能地使用“面向接口的编程”风格,这样才能在后期很方便的适配。
类结构图: