引言:

有一次我看到一个朋友拿出一个三角型的东西,好奇的上去一看你,我勒个去,传说中的万能插口转接器(插口适配器)。

一面是插入口,集合了我认识的所有插口的形状,也有国内没看见过的;另一个是跟插座接触的,也是集合了我见过的所有样式,当然也有我没见过的。

问了下,这个三角型的东西,全世界通用(前提是跟他的另一个变压器一起使用)。这个东西老贵了,不算变压器,也要两张毛爷爷多。

而这就是现实生活中的适配器模式。

理解:

适配器,就是把原来两个不能一起使用的东西、模块、系统,通过中间的一个转化器,变成两个东西、模块、系统可以连接起来一起使用。

这个在IT项目中是经常碰到的问题,比如我们需要在一个已有的系统平台中,加载我们开发的模块系统,那么授权系统就需要用别人的,

这个时候我们需要做一个适配器,把平台中的授权系统封装后,给我们系统使用。

适配器模式,分两种:接口适配器和对象适配器。

代码示例:

接口适配器

// 第三方系统的操作
public class OperateUserInfo
{
public String OperateUser()
{
return "用户的姓名";
}
}
// 获取用户信息接口
public interface IUser
{
String GetUserName();
}
// 实现接口
public class UserAdapter : IUser
{
OperateUserInfo _opObj = new OperateUserInfo();
public string GetUserName()
{
return _opObj.OperateUser();
}
}
static void Main(string[] args)
{
// 调用
IUser _userObj = new UserAdapter();
Console.WriteLine(_userObj.GetUserName());
Console.ReadLine();
}

对象适配器

public class User
{
public virtual String GetUserName()
{
return String.Empty;
}
} public class UserAdapter2 : User
{
OperateUserInfo _opObj = new OperateUserInfo();
public override String GetUserName()
{
return _opObj.OperateUser();
}
}
static void Main(string[] args)
{
// 调用
IUser _userObj = new UserAdapter();
Console.WriteLine(_userObj.GetUserName());
Console.WriteLine("----");
//
User _userObj2 = new UserAdapter2();
Console.WriteLine(_userObj2.GetUserName()); Console.ReadLine();
}

这两种模式的区别在于,接口的适配是没有默认实现的,所有的方法都是需要继承类自己实现的。
而对象模式是,可以有自己的实现的,这个其实就是抽象类和接口的区别吧。

总结:

1、 对象适配用处是,可以使Adaptee不必实现不需要的方法,具体就是其表现形式就是父类实现缺省方法,而子类只需实现自己独特的方法。
2、 适配器类可以是抽象类。
3、 带参数的适配器模式。使用这种办法,适配器类可以根据参数返还一个合适的实例给客户端。

应用场景:

1、 系统需要使用现有的类,而此类的接口不符合系统的需要。
2、 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3、 仅对对象适配器而言,在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

特别描述:

4、代码IUser _userObj = new UserAdapter();从耦合度来说这行代码的不符合要求,因为耦合度太高,所以需要我们设计时解耦。

解耦的方式是,使用反射和泛型的感念,来动态声明实例。

5、但是这里的Demo只是说明适配器模式,真真在设计时,如何使用适配器,肯定不是Demo中的那样。

代码下载:

百度云盘 http://pan.baidu.com/s/1bn6B7Z5

CSDN  http://download.csdn.net/detail/hater22/6850527

.Net设计模式_适配器模式的更多相关文章

  1. java_设计模式_适配器模式_Adapter Pattern(2016-08-09)

    概念 将一个接口转换成客户希望的另外一个接口.(该模式使得原本不兼容的类可以一起工作). UML图 适配器模式有类的适配器模式和对象的适配器模式两种不同的形式. (1)对象的适配器模式结构图 (2)类 ...

  2. PHP设计模式_适配器模式

    将各种截然不同的函数接口封装成统一的API. PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API.类似的场景还有cache适 ...

  3. 【GOF23设计模式】适配器模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_适配器模式.对象适配器.类适配器.开发中场景  适配器模式  笔记本电脑只有USB接口,新买的键盘是PS2接口的,需要用适 ...

  4. java设计模式5——适配器模式

    java设计模式5--适配器模式 1.结构型模式介绍 1.1.作用 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式 代理模式 桥接模式 装饰模式 组合模式 ...

  5. 每天一个设计模式-3 适配器模式(Adapteer)

    每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来 ...

  6. Head First 设计模式之适配器模式与外观模式

    Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计 ...

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

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

  8. Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

    1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...

  9. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...

随机推荐

  1. Redis — CentOS6.4安装Redis以及安装PHP客户端phpredis

    一.安装Redis 1.下载安装包 wget http://download.redis.io/releases/redis-2.8.6.tar.gz 2.解压包 tar xzf redis-2.8. ...

  2. (转载)StringGrid常用属性和常用操作

    Delphi StringGrid常用属性和常用操作 StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控 ...

  3. weixin

    http://gps.yesky.com/19/34467019.shtml http://***/goods.php?id=320 http://www.sablog.net/blog/archiv ...

  4. 修改PHP上传大小设置

    目前文档文库上传大小是读取服务器的PHP环境的设置,你们的PHP环境上传限制是多少,这里显示的就是多少. 很多用户问我如何修改上传大小,自己可以百度一下方法,也可以根据以下步骤修改: 1.找到服务务器 ...

  5. Android 常用权限

    添加WiFi以及访问网络的权限: <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" ...

  6. 设计模式之装饰(Decorator)模式 代码详解

    /** * Created with IntelliJ IDEA. * User: HYY * Date: 13-10-27 * Time: 下午10:49 * To change this temp ...

  7. 李洪强iOS开发之-环信02.3_具体接口讲解 - Apple Docs

    http://www.easemob.com/apidoc/ios/chat3.0/annotated.html Apple Docs.

  8. [wikioi]最优布线问题

    http://wikioi.com/problem/1231/ Kruskal+并查集.comp函数里面如果用const引用的话,可以减少copy.并查集find的时候是递归找父亲的根.无他. #in ...

  9. [wikioi]过河卒

    棋盘型动态规划.(PPT:http://wenku.baidu.com/view/56badad850e2524de5187ea3.html)该类动态规划有一个共性,那就是在一个矩阵中(一般是二维矩阵 ...

  10. log.isDebugEnabled()的使用

    转自: http://huangxx.iteye.com/blog/190693 在使用log4j,common-log这样的log框架时,发现很多代码中这样写 if   (log.isDebugEn ...