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. 201771010126 王燕《面向对象程序设计(Java)》第九周学习总结

    实验九 异常.断言与日志 实验时间 2018-10-25 1.实验目的与要求 (1) 掌握java异常处理技术: 异常积极处理方法:使用try子句捕获异常 异常小计处理方法:抛出throw异常类 (2 ...

  2. BUAA-OO-第一单元总结

    BUAA-OO第一单元博客总结 第一次作业总结 (1)类关系图 第一次作业类图关系简单,仅有一个Poly封装类以及一个Main主类调用Poly,Poly封装类内部完成了包括对象构造,求导,生成字符串的 ...

  3. db2数据库常见问题

    db2数据库不能轻易改变表结构,不然表会进入暂挂状态,造成表被锁住. 解锁表语句:call sysproc.admin_cmd('reorg table <table name>');

  4. ES6 常用语法

    1.let 定义变量 1.与var 类似 用于声明一个变量 let userName='kobe' 2.特点 1.在块作用域内有效 2.不会吃重复定义变量 3.应用 1.循环遍历加监听 2.使用let ...

  5. 关于Java 去除空格,换行的代码

    public static String replaceBlank(String str) { String dest = ""; if (str != null) { //Pat ...

  6. FCC(ES6写法) Map the Debris

    返回一个数组,其内容是把原数组中对应元素的平均海拔转换成其对应的轨道周期. 原数组中会包含格式化的对象内容,像这样 {name: 'name', avgAlt: avgAlt}. 思路: 直接使用公式 ...

  7. C++的结构体指针传参

    typedef struct node{int n;node *left;}*tnode; 传参的时候注意用** void init(node **nn);int main(){tnode nna;i ...

  8. [Swift]LeetCode30. 与所有单词相关联的字串 | Substring with Concatenation of All Words

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  9. [Swift]LeetCode157.用Read4来读取N个字符 $ Read N Characters Given Read4

    The API: int read4(char *buf) reads 4 characters at a time from a file.The return value is the actua ...

  10. [Swift]LeetCode161. 一次编辑距离 $ One Edit Distance

    Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串S和T,确定它们是否都是是一 ...