1、概要

适配:即在不改变原有实现的基础上,将原先不适合的接口转换成适合的接口.

what is Apater?适配,这个概念在生活中无处不在,比如你的iphone 4手机充电器坏了,这是时候只有一个iphone 8的充电器,两个充电器的头并不匹配,这个时候,你就需要一个充电器适配器.这个适配器将8的充电器转换成能支持4充电的充电器接口.这个例子在不改变8的充电器原有功能的情况下,将8不适合4的接口通过适配器转变成合适的接口.等等例子还有很多.

2、动机

在软件开发的过程中,常常需要将一些"现存的对象"放到新的环境中去,但是新的环境接口,这些对象并不满足.如何解决这种"迁移的变化",就是适配器模式要解决的问题.

3、意图

将已经稳定的一个类的接口转换成客户需要的接口,Apater模式使用原本由于接口不兼容的而不能一起工作的接口能一起工作.

4、代码实例-对象适配器

现在客户系统在实现一个功能的时候只需要ArrayList的部分功能,需要的功能通过ICustomerReqiured接口定义.这个时候.用适配器模式能很好的解决这个问题!

        /// <summary>
/// 客户要求的接口
/// </summary>
public interface ICustomerRequired
{
void Push(object item); object Pop(); object Peek();
} /// <summary>
/// 对象适配器
/// 对象适配器,Apater创建了一个ArrayList的包装器,缩小了ArrayList的接口范围,如果有特殊的业务需要使用ArrayList的部分方法,可以使用该模式
/// </summary>
public class Apater : ICustomerRequired
{
private ArrayList _apatee;//需要被适配的对象,也是存在的稳定的对象 public Apater(ArrayList arrayList)
{
_apatee = arrayList;
} /// <summary>
/// 返回最后一项
/// </summary>
/// <returns></returns>
public object Peek()
{
if (_apatee.Count >= )
return _apatee[_apatee.Count - ];
return null;
} /// <summary>
/// 移除最后一项,返回最后一项
/// </summary>
/// <returns></returns>
public object Pop()
{
_apatee.RemoveAt(_apatee.Count - );
return Peek();
} /// <summary>
/// 添加一项
/// </summary>
/// <param name="item"></param>
public void Push(object item)
{
_apatee.Add(item);
}
}

当然,失配器远比上面代码所展示的功能要强,不仅仅支持缩小限制ArrayList的功能,也能扩展、修改组合ArrayList的功能.

5、代码实例-类适配器

        /// <summary>
/// 类适配器
/// 类适配器,Apater继承了ArrayList,拥有了ArrayList类所有方法的同时,有实现客户要求的接口,但是违反了类职责单一的oop原则
/// </summary>
public class Apater :ArrayList,ICustomerRequired
{ public Apater(ICollection collection) : base(collection)
{ }
/// <summary>
/// 返回最后一项
/// </summary>
/// <returns></returns>
public object Peek()
{
if (Count >= )
return this[this.Count - ];
return null;
} /// <summary>
/// 移除最后一项,返回最后一项
/// </summary>
/// <returns></returns>
public object Pop()
{
this.RemoveAt(this.Count - );
return Peek();
} /// <summary>
/// 添加一项
/// </summary>
/// <param name="item"></param>
public void Push(object item)
{
this.Add(item);
}
}

分析上面的代码发现,虽然Apater很好的完成了需求,但是存在以下两个缺点:

1、违背了OOP原则一类的单一职责,Apater即有ArrayList的职责,又包含了ICustomerRequired接口的职责.这种方式的适配器不建议使用,更建议使用对象适配器!

2、类只能单继承,当适配器需要适配多个类时,类适配器就无法完成这个任务.

3、类之间的强耦合关系(在OOP中,继承会自带耦合效果),当被适配的类发生改变时,当前适配器会被强加这种改变.

所以,使用类适配器需要慎重.相比类适配器更推荐第一种对象适配器.

6、关于适配器模式的设计建议

客户端调用,优先使用客户要求的接口类,如下代码:

    /// <summary>
/// 第三方调用系统
/// </summary>
public class ThirdSystem
{
/// <summary>
/// 建议这种调用方式,更符合OOP的思想
/// </summary>
/// <param name="customerRequired"></param>
public void Process(ICustomerRequired customerRequired)
{ } /// <summary>
/// 不建议这种方法
/// </summary>
/// <param name="apater"></param>
public void ProcssError(Apater apater)
{ }
}

上面的代码更加符合面向接口的编程思想.

7、.Net Framework中使用适配器模式的案例

        public class User
{
public string Name { get; set; } public int Age { get; set; }
} /// <summary>
/// IComparer<User> 为客户程序要求适配器实现的接口,必须实现该接口,完成对两个User实例的年龄比较
/// </summary>
public class UserCompareApater : IComparer<User>
{
/// <summary>
/// User类作为被适配对象
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public int Compare(User x, User y)
{
if (x.Age > y.Age)
return ;
else if (x.Age < y.Age)
return -;
return ;
}

通过适配器,继承了FCL中提供的两个类型比较的接口,实现了对两个User实例的排序。

其它的例子还有很多.如.Net数据库访问类(Apater变体),主流的数据库都没有提供DataSet接口,但是使用DbDataApater可以访问各种数据库,并且将读取过来的数据填充到DataSet实例中.

Apater适配器模式(结构型模式)的更多相关文章

  1. 设计模式(七):Adapter 适配器模式 -- 结构型模式

    1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以 ...

  2. NET设计模式 第三部分 结构型模式(7):适配器模式(Adapter Pattern)

    适配器模式(Adapter Pattern) ——.NET设计模式系列之八 Terrylee,2006年2月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但 ...

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

    Adapter 适配器模式(结构型模式) 适配(转换)的概念无处不在:电源转接头.电源适配器.水管转接头... 动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象 ...

  4. 初探Java设计模式2:结构型模式(代理模式,适配器模式等)

    行为型模式 行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰. 策略模式 策略模式太常用了,所以把它放到最前面进行介绍.它比较简单,我就不废话,直接用代码说事吧. 下面 ...

  5. Java设计模式之结构型模式

    结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 一.适配器模式: 意图: 将一个类的接口转换成客户希望的另外一个接口.Adapter 模式使得原本由于接 ...

  6. 第27章 结构型模式大PK

    27.1 代理模式 VS 装饰模式 27.1.1 代理模式 (1)场景:客人找运动员代理要求安排运动员参加比赛 (2)说明:代理人有控制权,可以拒绝客人的要求,也可以答应安排,甚至自己下去跑(因为有些 ...

  7. .NET设计模式(15):结构型模式专题总结(转)

    摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能(对象结构型模式).这些结构型模式,它们在某些方面具有很大的相似 ...

  8. Java 23种设计模式详尽分析与实例解析之二--结构型模式

    Java设计模式 结构型模式 适配器模式 模式动机:在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式.通常情况下,客户端可以通过目标类的接口访问它所提供的服务.又是,现有的类可以满足客 ...

  9. Java经典23种设计模式之结构型模式(一)

    结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...

随机推荐

  1. Mybatis-Plus 实战完整学习笔记(五)------insert测试

    一.更新操作探究(3.0.3版本) demo /** * 修改用户 * @throws SQLException */ @Test public void update() throws SQLExc ...

  2. 20155205 2016-2017-2 《Java程序设计》第10周学习总结

    20155205 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 计算机网络基础 什么是网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数 ...

  3. 模块import,from ..import...

    首次导入模块发生3件事 1.创建一个模块的名称空间 2.执行文件spam.py,将执行过程中产生的名字都放到模块的名称空间中 3.在当前执行文件中直接拿到一个名字,该名字就是执行模块中相对应的名字 f ...

  4. Android自定义视图一:扩展现有的视图,添加新的XML属性

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  5. X Window(远程桌面)

    X Window在位映射屏幕上的一个或多个窗口中运行程序.用户可以在每个窗口中同时运行多个程序,并且可以通过用鼠标在窗口之间进行切换. x服务器的程序在本地工作站上运行,并且管理它的窗口和程序. 每个 ...

  6. (贪心 or DP)Woodcutters -- Codefor 545C

    http://codeforces.com/contest/545/problem/C  Woodcutters time limit per test 1 second memory limit p ...

  7. POJ2112 Optimal Milking

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 17811   Accepted: 6368 ...

  8. hadoop两大核心之一:MapReduce总结

    MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,MapReduce程序 本质上是并行运行的,因此可以解决海量数据的计算问题. MapReduce任务过程被分为两个处理阶段 ...

  9. 2.Java面向对象编程三大特性之继承

    在<Think in Java>中有这样一句话:复用代码是java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复用代码并对其加以改变是不够的,他还必须能够做更多的事情.复用 ...

  10. Eclipse运行wordcount步骤

    Eclipse运行wordcount步骤 第一步:建立工程,导入代码. 第二步:建立文件写入数据(以空格分开),并上传到hdfs上. 1.创建文件并写入数据: 2.上传hdfs 在hadoop权限下就 ...