什么是适配器模式?

  适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。

   Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

什么时候运用适配器模式?

  在想使用一个已经存在的类时,如果它的接口,也就是它的方法与我们当前的要求不相同时,就需要考虑用到适配器模式了。

  一般而言,使用适配器模式是出于无奈之举,一般存在于软件开发后期或者维护期,在软件设计阶段,我们还是尽量避免该模式的使用。

适配器模式的组成

   Target:目标接口,也就是客户所期待的接口。目标可以是具体的或者抽象的类,也可以是接口。

  Adpatee:需要适配的类。也就是我们需要与目标接口对接成功的类。

  Adapter:中间起到链接作用的类。通过在内部包装一个Adptee对象,将源接口转换成目标接口。

适配器模式具体实现

适配器模式的结构

  

适配器模式的实现

Target类:也就是目标类

 class Target
{
public virtual void Request()
{
Console.WriteLine("普通请求");
}
}

Adaptee类:需要适配的类

 class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊请求");
}
}

Adapter类:

 class Aapter : Target
{
private Adaptee adaptee = new Adaptee();
/// <summary>
/// 这样就可以把表面调用Request()方法变成实际调用SpecificRequest()
/// </summary>
public override void Request()
{
adaptee.SpecificRequest();
}
}

主函数调用:

 static void Main(string[] args)
{
//对客户端来说,调用的是Target的Request()
Target target = new Aapter();
target.Request(); Console.Read();
}

实例解析

  为了深化理解,我们准备一个具体的实例来分析。

   姚明作为一个外籍的球员在进入NBA初期,由于英文水平一般,常常听不懂教练的指挥与安排,需要翻译来全程跟随以实现沟通。请就此来写出具体的情况。

分析:

   在这里,我们不难发现教练的指挥与安排就是Target,姚明就是Adaptee,而翻译就理所当然成了Adapter,那么我们就能分析出彼此的关系了。

  

具体实现:

     class Program
{
static void Main(string[] args)
{
Player b = new Forwards("A");
b.Attack(); Player m = new Guards("B");
m.Attack(); //通过翻译,姚明知道了需要做的事情
Player ym = new Translator("姚明");
ym.Attack();
ym.Defense(); Console.Read();
} abstract class Player
{
protected string name;
public Player(string name)
{
this.name = name;
}
public abstract void Attack();
public abstract void Defense();
}
/// <summary>
/// 前锋
/// </summary>
class Forwards : Player
{
public Forwards(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("前锋{0} 进攻", name);
}
public override void Defense()
{
Console.WriteLine("前锋{0} 防守", name);
}
}
/// <summary>
/// 中锋
/// </summary>
class Center : Player
{
public Center(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("中锋{0} 进攻", name);
}
public override void Defense()
{
Console.WriteLine("中锋{0} 防守", name);
}
}
/// <summary>
/// 后卫
/// </summary>
class Guards : Player
{
public Guards(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("后卫{0} 进攻", name);
}
public override void Defense()
{
Console.WriteLine("后卫{0} 防守", name);
}
}
/// <summary>
/// 翻译是继承于运动员的,因为他需要直接理解教练的意思
/// 但是他实际需要传达的是外籍球员,所以他调用的是外籍球员所理解的方法=>也就是翻译的作用
/// </summary>
class Translator : Player
{
private ForeignCenter fc = new ForeignCenter();
public Translator(string name) : base(name)
{
fc.Name = name;
}
public override void Attack()
{
fc.进攻();
}
public override void Defense()
{
fc.防守();
}
}
/// <summary>
/// 作为外籍球员,他有自己的姓名和进攻防守方式等
/// 其他的事情交给翻译就好了
/// </summary>
class ForeignCenter
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public void 进攻()
{
Console.WriteLine("外籍中锋{0} 进攻", name);
}
public void 防守()
{
Console.WriteLine("外籍中锋{0} 防守", name);
}
}
}

适配器模式的优缺点

  像之前提到的适配器能在后期维护的时候起到很大的作用,能在开发新的功能的时候保护原来软件的稳定性,但是初期的时候还是能避免就尽量避免吧!

备注:文中所有代码及知识点均来自于《大话设计模式》,本人属于边学边看边敲代码边总结的阶段。

C#学习笔记-适配器模式的更多相关文章

  1. 学习笔记——适配器模式Adapter

    适配器模式适用于将不一致的接口转换为一致的接口. 比如,去香港玩儿,带上了自己的笔记本电脑,结果晚上插电时就抓瞎了,电源插孔与插座不一致.WTF…… 插座是酒店装好的,不可能拆了换一个,电源是自己的, ...

  2. 《Head First 设计模式》学习笔记——适配器模式 + 外观模式

    在ADO.NET中.对于我们从数据库中取出的数据都要放到一个DataSet中,无论你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中..NET中并没有提供 ...

  3. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  4. [学习笔记]设计模式之Adapter

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Adapter(适配器)模式主要解决接口不匹配的问题.为此,让我们要回到最初Builder模式创建平行世界时,白雪公主和小霍比特人的谜 ...

  5. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  6. springmvc学习笔记(简介及使用)

    springmvc学习笔记(简介及使用) 工作之余, 回顾了一下springmvc的相关内容, 这次也为后面复习什么的做个标记, 也希望能与大家交流学习, 通过回帖留言等方式表达自己的观点或学习心得. ...

  7. 23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter

    23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter 2016-07-22 (www.cnblogs.com/icmzn) 模式理解

  8. 23 DesignPatterns学习笔记:C++语言实现

    DesignPatterns学习笔记:C++语言实现 (转载请注明出处:http://www.cnblogs.com/icmzn/p/5680784.html) 1. 创建型设计模式: (1)Faco ...

  9. 设计模式学习笔记——java中常用的设计模式

    单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...

随机推荐

  1. 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序

    引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序(http://www.cnblogs.com/chenxizhang/p/7148657.ht ...

  2. ML01 机器学习后利用混淆矩阵Confusion matrix 进行结果分析

      目标: 快速理解什么是混淆矩阵, 混淆矩阵是用来干嘛的. 首先理解什么是confusion matrix 看定义,在机器学习领域,混淆矩阵(confusion matrix),又称为可能性表格或是 ...

  3. 关于windows phone 8.1系统手机对html5触摸事件的支持情况

    近日购入一部微软Lumia 640手机,目的主要就是为了测试年中开发完成的响应式移动web项目,同时也为了将来升级win10 mobile系统.由于我们的项目目前只考虑支持IOS与Android系统, ...

  4. Error updating database. Cause: java.sql.BatchUpdateException: Field 'id' doesn't have a default value

    异常信息 ### Error updating database. Cause: java.sql.BatchUpdateException: Field 'id' doesn't have a de ...

  5. 以List为例浅谈C#的学习方法

    前言:关于学习方法的讨论其实是个比较模糊的概念,对于List的介绍的资料其实已经很多了,但是一般是介绍List本身,我打算分享的是,以温故List为例,来获取新知识的这么一个过程.这里的新知识也不是什 ...

  6. Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?

    在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanc ...

  7. spark-submit参数说明--on YARN

    示例: spark-submit [--option value] <application jar> [application arguments] 参数名称 含义 --master M ...

  8. 在jQuery中使用canvas时遇到的问题

    正常的情况下一般在JavaScript中使用canvas,会用到如下代码: var canvas=document.getElementById("canvas"); var co ...

  9. 【java设计模式】【创建模式Creational Pattern】工厂方法模式Factory Method Pattern(多态性工厂模式Polymorphic Factory Pattern、虚拟构造子模式Virtual Constructor Pattern)

    public class Test { public static void main(String[] args){ Creator ca=new ConcreteCreatorA(); ca.cr ...

  10. C++11 新知识点

    翻了下新版的C++ Primer,新的C++ 11真是变化很大,新增了很多语法特性.虽然已经很久没在写C++了,但一直对这门经典语言很感兴趣的,大致看了看前几章基础部分,总结下新特性备个忘吧.估计也很 ...