简介:

适配器模式在我看来是最无聊的一种模式,因为他根本不是一种新的创意模式,而是一种不得已而为之的模式。就算不学适配器模式,在具体应用场景中也会自然而然的想到这种解决方案。

张三在英国留学时买了个笔记本,使用的外接电源为欧式标准。现在回国了(中国电源标准不同意欧洲标准),要想让笔记本继续正常工作,有两种方案,1为重新改造笔记本,2为买个电源转换器,将欧式电源转换为中式电源。

上面中的1,重新改造笔记本,相当于我们软件工程中的代码重构,难度大,风险高。

2即为本文中所描述的适配器模式,只需要稍微修改外部调用接口,内部实现逻辑不用改变。

适配器模式的定义:

将一个类的接口转换为客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

转换匹配,复用功能

适配器模式的组成:

1.Target 定义客户端需要的接口。即上文的中式电源接口

2.Adaptee,已经存在的接口,通常已经能够满足客户的需求,但是接口跟客户端要求的不大一致。即上文的英式电源接口

3.Adapter:适配器,将Adaptee转换为Target,即适配器模式的核心。

继承Target类或者实现Target接口

需要传入Adaptee对象参数,对外展现为Target的接口方法,内部实现实为Adaptee接口方法。

代码如下:

电脑原始的英式电源(以及其接口类,欧式电源):

/// <summary>
/// 欧式电源供电API
/// </summary>
public interface EurPowerSupplyApi
{
/// <summary>
/// 充电
/// </summary>
/// <returns></returns>
void Charge(); /// <summary>
/// 供电
/// </summary>
/// <returns></returns>
void Supply();
} /// <summary>
/// 英式电源供电,对应适配器模式中的Adaptee
/// </summary>
public class UKPowerSupply : EurPowerSupplyApi
{
public Power MyPower
{
get { return _myPower; }
set { _myPower = value; }
}
private Power _myPower; public void Charge()
{
Console.WriteLine("I am using UK PowerSupply.");
} public void Supply()
{
Console.WriteLine("The UK PowerSupply is supplying my PC");
}
}

原始调用代码为:

/// <summary>
/// 原始英式电源供电测试类
/// </summary>
public class AddpterTest
{
public static void Main(string[] args)
{
EurPowerSupplyApi powerSupply = new UKPowerSupply(); //英式电源充电中
powerSupply.Charge();
//英式电源供电中
powerSupply.Supply(); Console.ReadLine();
}
}

中式电源接口(方法名、方法参数都不同于原来的欧式电源接口)

/// <summary>
/// 中式电源供电API
/// </summary>
public interface ChinesePowerSupplyAPI
{
void ChongDian(Power aPower); void GongDian(Power aPower);
}

适配器代码为:

/// <summary>
/// 电源转换器,对应适配器模式中的Adapter,需要实现客户端将于调用的接口(ChinesePowerSupplyAPI)的方法
/// </summary>
public class PowerSupplyAdapter : ChinesePowerSupplyAPI
{
/// <summary>
/// 将要被适配、被转换的接口对象,对应适配器模式中的Adaptee
/// </summary>
private EurPowerSupplyApi adaptee; /// <summary>
/// 构造函数,传入Adaptee
/// </summary>
/// <param name="aAdaptee"></param>
public PowerSupplyAdapter(EurPowerSupplyApi aAdaptee)
{
this.adaptee = aAdaptee;
} /// <summary>
/// 实现Target的ChongDian方法
/// </summary>
/// <param name="aPower"></param>
public void ChongDian(Power aPower)
{
adaptee.Charge();
} /// <summary>
/// 实现Target的GongDian方法
/// </summary>
/// <param name="aPower"></param>
public void GongDian(Power aPower)
{
adaptee.Supply();
}
}

适配器测试代码为:

/// <summary>
/// Apapter测试类
/// </summary>
public class AddpterTest
{
public static void Main(string[] args)
{
//现有英国电源充电器
UKPowerSupply ukSupply = new UKPowerSupply();
ukSupply.MyPower = new Power(80); //电源适配器,传入英国电源,可以转换为中式电源
PowerSupplyAdapter adapter = new PowerSupplyAdapter(ukSupply);
adapter.ChongDian(ukSupply.MyPower);
adapter.GongDian(ukSupply.MyPower); Console.ReadLine();
}
}

补充描述:

1.适配器模式的主要功能时进行转换匹配,目的是复用已有的功能,而不是来实现新的接口。主要负责将不兼容的接口转换客户端期望的样子即可。

2.Adaptee和Target一般为同类对象(如上文中欧式电源接口和中式电源接口),也可以为前后不同的两个版本接口。本身是没有关联的,内部方法签名可以相同,也可以不同(如本文方法名称和参数都不相同)。

3.双向适配器。

上面的例子是适配器的功能是把欧式电源转换为中式电源,同样的,也可以把中式电源转换为欧式电源,还可以把这两个接口放在同一个类中。

设计模式-适配器模式(Adapter)的更多相关文章

  1. 设计模式 - 适配器模式(adapter pattern) 具体解释

    适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...

  2. 设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释

    适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter patter ...

  3. 设计模式--适配器模式Adapter(结构型)

    一.适配器模式 适配器模式的主要作用是在新接口和老接口之间进行适配.将一个类的接口转换成客户端期望的另外一个接口.其实适配器模式有点无赖之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该通过重 ...

  4. 说说设计模式~适配器模式(Adapter)

    返回目录 之前和大家一起谈了工厂模式和单例模式,今天来看一下另一种非常常用的模式,它就是适配器模式,第一次看到这个模式是通过“张逸”老师的“设计之道”这篇文章,在这里表adapter讲的很透彻,今天把 ...

  5. [工作中的设计模式]适配器模式adapter

    一.模式解析 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 也就是说,如果已经写好了一个接口,但是又来了一种截然不同的接口,如 ...

  6. C#设计模式——适配器模式(Adapter Pattern)

    一.概述在软件开发中,常常会想要复用一个已经存在的组件,但该组件的接口却与我们的需要不相符,这时我们可以创建一个适配器,在需复用的组件的接口和我们需要的接口间进行转换,从而能够正常的使用需复用的组件. ...

  7. 大话设计模式--适配器模式 Adapter -- C++实现实例

    1.适配器模式: 将一个类的接口转换为客户希望的另一个接口,使得原来由于接口不能一起工作的那些类一起工作. 适配器模式一般用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 适配器模式分 ...

  8. [设计模式]适配器模式Adapter

    将一个类的接口转换成客户希望的另外一个接口. A d a p t e r模式使得原本 由于接口不兼容而不能一起工作的那些类可以一起工作.

  9. 设计模式(五)适配器模式Adapter(结构型)

      设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...

随机推荐

  1. JAVA 拆分窗口

    //拆分窗口 import java.awt.*; import javax.swing.*; public class Jiemian8 extends JFrame{ JSplitPane cf; ...

  2. jquery 源码剖析1

    ()();   闭包,让声明的变量变成局部变量,使外部无法访问,防止和其他代码冲突,互不影响. (function(){ })();              和一般执行方法一样的. jQuery=f ...

  3. Java Volatile相关文章目录

    参考资料: http://www.google.com/cse?sa.x=0&sa.y=0&cx=010284515138798138769%3Aajbqkpwaapm&ie= ...

  4. SQL 获取各表记录数的最快方法

    select distinct o.name,i.rows from sysobjects o,sysindexes  i where o.id=i.id and o.Xtype= 'U' and i ...

  5. oracle 数据恢复,只有oradata文件夹里的文件,没有备份文件的数据库恢复,重装系统后,oracle 10g数据库恢复

    格式化重装系统后,才想起来oracle 10g 数据库没有做备份,开始以为很麻烦,没想到数据库恢复的还挺顺利的 恢复方法: 1,把原来的数据库文件备份,(D:\oracle\product\10.2. ...

  6. 蓝桥杯---剪格子(DFS&BFS)(小总结)

    问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+ ...

  7. 在开发板Linux上挂载"驱动"挂载不成功,出现提示server 172.27.52.100 not responding, still trying

    1.在开发板具体操作步骤如下:   1.1 :设置IP ifconfig eth0 172.27.52.200   1.2 :ping通 虚拟机Linux 主机Linux ping XXX.XXX.X ...

  8. (Loadrunner)Abnormal termination, caused by mdrv process termination.(转)

    Load generator跑了太多用户导致CPU和内存爆满,进程无法处理请求 确认自定义的代码是否释放内存 合理调整或增加思考时间 关闭extended log 尽量避免使用Load generat ...

  9. 一步一步学习Unity3d学习笔记系1.2 单机游戏和网游的数据验证概念

    这一次的笔记的主要内容是单机和网游的数据存储,数据验证方式,在游戏的时候除了控制角色的行动,还涉及到用户角色的升级,经验,金钱赚取,道具购买,技能升级 等等一些数据的交易, 那么单机游戏和网游的区别如 ...

  10. Windows 7的100M隐藏分区

    1.Windows 7的100MB的隐藏分区是Windows 7的活动分区,类似于Linux的/boot. 这其实有点类似Linux的做法,Linux在安装过程中可以专门分出一个100MB左右的分区作 ...