引言:

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

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

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

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

理解:

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

这个在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. 调度思路+EurekaServer获得当前机器的instanceid

    调度思路 概念 Build 一次完整的构建 整个流水线 Task(BuidStep) 流水线中的某一个步骤单元 先假设对于一个Build(流水线)而言里面所有Task是串行执行的 并且各Task之间不 ...

  2. 理解依赖注入(IOC)和学习Unity

    资料1: IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection). 作用:将各层的对象以松耦合的方式组织在一 ...

  3. OpenCart框架运行流程介绍

    框架运行流程介绍 这样的一个get请求http://hostname/index.php?route=common/home 发生了什么? 1. 开始执行入口文件index.php. 2. requi ...

  4. PHP框架原理

    本文主要来聊聊框架理论,但不针对任何一款框架,不过任何一款框架都离不开这个理论,首先我们了解下框架的来龙去脉,任何技术的出现都是为了解决某个问题,之前的博客有讲过smarty,其存在就是为了html和 ...

  5. jbpm4.4 spring整合

    jBPM-4.4与Spring集成配置比较容易,这里我使用的是Spring-2.5.6,数据库连接池使用C3P0,将相关的两个jar文件加入到CLASSPATH中. jBPM-4.4与Spring集成 ...

  6. Leetcode 解题 Longest Substring without repeating charcater python

    原题: Given a string, find the length of the longest substring without repeating character For example ...

  7. bzoj4038: 医疗援助

    Description 一只带着先进设备和药物的医疗团队来到了埃博拉病毒疫区的某个非洲国家.这个国家有n个村庄,均坐落在该国唯一的一条公路旁,n个村庄依次标号为1,2,…n.第i个村庄有a_i个埃博拉 ...

  8. No Hibernate Session bound to thread, and configuration does not allow creat

    No Hibernate Session bound to thread, and configuration does not allow creat 今天遇到这么一个错误,在网上差了很多都没有能解 ...

  9. SPRING IN ACTION 第4版笔记-第一章-004-用类来管理DI

    一. 1. package chapter01.sia.knights.config; import org.springframework.context.annotation.Bean; impo ...

  10. Beej网络socket编程指南

    bind()函数 一旦你有一个套接字,你可能要将套接字和机器上的一定的端口关联 起来.(如果你想用listen()来侦听一定端口的数据,这是必要一步--MUD 告 诉你说用命令 "telne ...