C#学习笔记之适配器模式详解
什么是适配器模式?
适配器模式(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); } } }
适配器模式的优缺点
像之前提到的适配器能在后期维护的时候起到很大的作用,能在开发新的功能的时候保护原来软件的稳定性,但是初期的时候还是能避免就尽量避免吧!
备注:文中所有代码及知识点均来自于《大话设计模式》,本人属于边学边看边敲代码边总结的阶段。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
您可能感兴趣的文章
- 01-10C#一个简单的定时小程序实现代码
- 01-10微信开放平台之网站授权微信登录功能
- 01-10C#编程自学之数据类型和变量二
- 01-10C#编程自学之开篇介绍
- 01-10C#编程自学之数据类型和变量三
- 01-10C#编程自学之运算符和表达式
- 01-10C#编程自学之类和对象
- 01-10C#编程自学之数据类型和变量一
- 01-10C#编程自学之流程控制语句
- 01-10C#影院售票系统毕业设计(1)
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 01-10delphi制作wav文件的方法
- 04-02jquery与jsp,用jquery
- 01-10SublimeText编译C开发环境设置
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-11ajax实现页面的局部加载
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10C#中split用法实例总结