Adapter - 适配器模式

  现实生活中,我们常用到适配器。

  你当前打开我这篇文章的笔记本电脑,电源的另一边不正连着一块适配器吗?

  你平时想将三口插座插进二口插座里面,不也需要一个适配器吗?

  整天插在插座上的手机充电头,不也是一个适配器吗?

目录

  • 第一种:类适配器(使用继承)
  • 第二种:对象适配器(使用委托)
  • 抽象的 UML 类图

第一种:类适配器(使用继承)

  这里,我假设家用功率为 220v,经过适配器,输出为 18v,可供我的笔记本进行使用。

  类图

  Portal(入口) 类:只有一个方法 Input(),来表示输入的电流功率。

  IOutput(输出)接口:只有一个方法 Output(),来表示经过转换后输出的电流功率。

  Adapter(适配器)类:实现了 IOutput 接口。

  Portal.cs 类

     /// <summary>
/// 入口
/// </summary>
class Portal
{
private readonly string _msg; public Portal(string msg)
{
_msg = msg;
} /// <summary>
/// 输入(电流)
/// </summary>
public void Input()
{
Console.WriteLine(_msg + " --> 18v。");
}
}

  

  IOutput.cs 接口

     interface IOutput
{
/// <summary>
/// 输出(电流)
/// </summary>
void Output();
}

  Adapter.cs 类

     /// <summary>
/// 适配器
/// </summary>
class Adapter : Portal, IOutput
{
public Adapter(string msg) : base(msg)
{
} public void Output()
{
Input();
}
}

  Client.cs 类

     class Client
{
static void Main(string[] args)
{
IOutput adapter = new Adapter("220v");
adapter.Output(); Console.Read();
}
}

  客户端在使用的过程中,我们只知道输出的结果即可,内部实现不需要理会。

第二种:对象适配器(使用委托)

  委托:自己不想做的事,交给第三方去做。

  类图

  Portal.cs 类

     /// <summary>
/// 入口
/// </summary>
class Portal
{
private readonly string _msg; public Portal(string msg)
{
_msg = msg;
} public void Input()
{
Console.WriteLine(_msg + " --> 18v");
}
}

  Adapter.cs 类

     class Adapter : Export
{
private readonly Portal _portal; public Adapter(string msg)
{
_portal = new Portal(msg);
} public override void Output()
{
_portal.Input();
}
}

  Export.cs 类

     /// <summary>
/// 出口
/// </summary>
abstract class Export
{
public abstract void Output();
}

抽象的 UML 类图

  4 种角色:Adaptee(被适配),Adapter(适配者),Client(使用场景),Target(目标对象)。

  Adaptee(被适配):不是 -er 结尾的哦,之前的 Portal(入口)类作为被适配者。

  Adapter(适配者):作为 Adaptee 和 Target 的媒介,进行调节。

  Client(使用场景):一个调用的入口,以 Main() 作为入口函数。

  Target(目标对象):调节(适配)后的输出,之前的 IOutput 接口和 Export 类都是作为 Target 对象。

图:类适配器(使用继承)

图:对象适配器(使用委托)

C# 设计模式系列

  《Iterator - 迭代器模式:我与一份奥利奥早餐的故事


【博主】反骨仔

【原文】http://www.cnblogs.com/liqingwen/p/6560899.html

[C# 设计模式] Adapter - 适配器模式(两种)的更多相关文章

  1. 一天一个设计模式——Adapter适配器模式(Wrapper模式)

    一.模式说明 在现实生活中,当需要将两种设备连接起来,但是两个设备的接口规范又不一致(比如电脑上只有Type-C接口,但是你的显示器是HDMI接口),这时候就需要一个适配器,适配器一端连接电脑,一端连 ...

  2. C++设计模式-Adapter适配器模式

    Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 分为类适配器模式和对象适配器模式. 系统的数据和 ...

  3. C++设计模式-Adapter适配器模式(转)

    Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 分为类适配器模式和对象适配器模式. 系统的数据和 ...

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

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

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

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

  6. 设计模式之适配器模式(Adapter)(6)

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

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

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

  8. java设计模式之——适配器模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极.阴极 ...

  9. Java设计模式----初识适配器模式

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

随机推荐

  1. VS2017Release+x64失败,LNK1104,无法打开文件"msvcprt.lib"

    采用VS2017+Qt5.10联合开发环境建立开发,将Qt的库包含到VS中使用VS2017的Debug+x64模式调试程序,通过并出现对应的EXE应用程序! 但是转换到Release+x64模式出现问 ...

  2. Flutter 文本样式继承

    使用inherit来设置是否继承样式 DefaultTextStyle( style: TextStyle(color: Colors.red, fontSize: 22), child: Colum ...

  3. HttpClient 调用WebAPI时,传参的三种方式

    public void Post() { //方法一,传json参数 var d = new { username = " ", password = " ", ...

  4. YOU种你来丨i春秋校园行第一站北京电子科技学院

    发通告啦 i春秋互联网安全校园行即将火爆开启,第一站我们将来到北京电子科技学院.对网络安全感兴趣的大学生们注意啦,我们将走进校园送福利,Are you ready? i春秋简介 i春秋拥有全国最大的网 ...

  5. [Swift]LeetCode399. 除法求值 | Evaluate Division

    Equations are given in the format A / B = k, where A and B are variables represented as strings, and ...

  6. [Swift]LeetCode806. 写字符串需要的行数 | Number of Lines To Write String

    We are to write the letters of a given string S, from left to right into lines. Each line has maximu ...

  7. zuul网关入门(一、网关具有的功能)

    1. zuul网关入门(一.网关具有的功能) 1.1. 基本场景 1.1.1. API网关的由来 1.1.2. API网关基本功能 1.2. 高级应用 1.2.1. 亮点 可动态发布的过滤器机制 1. ...

  8. Firefox 多行标签的解决方案分享

    更新了 Quantum 以后 TabMixPlus 就不能用了,我最中意的多行标签也没了,捣鼓了一下终于重新回来了. 指南: https://discourse.mozilla.org/t/tabs- ...

  9. Python中的json模块

    在Python内置函数中,有一个eval()函数可以将字符串内容转换成Python对象,比如我现在将一个字典 dic = {"name":"pengfy"}写到 ...

  10. 【单例模式】java实现

    概述:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 关键点: 构造函数不对外开放,一般为private. 通过一个静态方法或者枚举返回单例类对象. 确保单例类的对象有且只有一个,尤 ...