返回目录

之前和大家一起谈了工厂模式单例模式,今天来看一下另一种非常常用的模式,它就是适配器模式,第一次看到这个模式是通过“张逸”老师的“设计之道”这篇文章,在这里表adapter讲的很透彻,今天把张老师的文章拿过来,分享给大家!

何时能用到它?

对于一个软件生产商A来说,在过去的20年里,它们主要生产收音机,包括最早的老式半导体和现代的数字收音机,总之,是收音机。但不知道从什么时候开始,MP4媒体播放器出现了,这使得A生产商不得不去招新人,去生产适合大家的mp4播放器,这东西很好,能听音乐,看电影,比20年前的收音机好多了!

正在A生产商洋洋得意时,突然有个客户投诉他们,说你们的东西为何没有收音机的功能,我想叫广播!这下可让A生产商发愁了,它马上找到了公司的技术总监,CTO是个很厉害的岗位,它们无所不能,只要你有需求,我们就可以给你实现!CTO是如何让mp4播放器具体收音机功能的呢?大家继续看

适配器模式的结构图

aaarticlea/png;base64,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" alt="" />

适配器模式实现说明

媒体播放接口IMedia

视频实现抽象类VideoMedia

音频实现抽象类AudioMedia

mp4播放器实现类:mp4Media和mp3Media,可能还有FlvMedia等

收音机接口IRadio

收音机抽象类Radio

收音机FM调频实现类FmRadio

收音机FM调频与媒体播放器的适配器FmAdapter

适配器模式的C#实现

#region adapter[播放器适配器]
#region 媒体播放器
interface IMedia
{
void Play();
void Stop();
void Next();
void Prev();
void Pause();
void OpenFile();
void CloseFile();
}
abstract class AudioMedia : IMedia
{
public virtual void Play()
{
throw new NotImplementedException();
} public void Stop()
{
throw new NotImplementedException();
} public void Next()
{
throw new NotImplementedException();
} public void Prev()
{
throw new NotImplementedException();
} public void Pause()
{
throw new NotImplementedException();
} public void OpenFile()
{
throw new NotImplementedException();
} public void CloseFile()
{
throw new NotImplementedException();
}
}
abstract class VideoMedia : IMedia
{
public virtual void Play()
{
throw new NotImplementedException();
} public void Stop()
{
throw new NotImplementedException();
} public void Next()
{
throw new NotImplementedException();
} public void Prev()
{
throw new NotImplementedException();
} public void Pause()
{
throw new NotImplementedException();
} public void OpenFile()
{
throw new NotImplementedException();
} public void CloseFile()
{
throw new NotImplementedException();
}
}
class Mp3Media : AudioMedia
{
public override void Play()
{
base.Play();
Console.WriteLine("播放mp3");
}
}
class Mp4Media : VideoMedia
{
public override void Play()
{
base.Play();
Console.WriteLine("播放mp4");
}
}
#endregion
#region 收音机
interface IRadio
{
void Receive();
void Stop();
void TurnOn();
void TurnOff();
void Change(bool direction);
}
abstract class Radio : IRadio
{
public virtual void Receive()
{
throw new NotImplementedException();
} public void Stop()
{
throw new NotImplementedException();
} public void TurnOn()
{
throw new NotImplementedException();
} public void TurnOff()
{
throw new NotImplementedException();
} public virtual void Change(bool direction)
{
throw new NotImplementedException();
}
}
class FmRadio : Radio
{
public override void Receive()
{
base.Receive();
Console.WriteLine("接口FM频段");
}
public override void Change(bool direction)
{
base.Change(direction);
Console.WriteLine("改变FM频段");
}
}
#endregion
#region 收音机到媒体播放器的适配器
class FMAdapter : Radio, IMedia
{
//! 适配器通过Radio去实现了IMedia接口 public void Play()
{
base.TurnOn();
base.Receive();
} public void Stop()
{
base.TurnOff();
} public void Next()
{
base.Change(true); } public void Prev()
{
base.Change(false);
} public void Pause()
{
throw new NotImplementedException();
} public void OpenFile()
{
throw new NotImplementedException();
} public void CloseFile()
{
throw new NotImplementedException();
}
}
#endregion
#endregion

这样我们就实现了Radio与Media两大对象的联系,而这种联系是在不破坏对象本身的基础上实现的,这种实现的过程就是适配器模式实现的过程!

感谢GOF,感谢张逸老师!

返回目录

说说设计模式~适配器模式(Adapter)的更多相关文章

  1. 设计模式 - 适配器模式(adapter pattern) 具体解释

    适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...

  2. 设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释

    适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter patter ...

  3. 设计模式--适配器模式Adapter(结构型)

    一.适配器模式 适配器模式的主要作用是在新接口和老接口之间进行适配.将一个类的接口转换成客户端期望的另外一个接口.其实适配器模式有点无赖之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该通过重 ...

  4. [工作中的设计模式]适配器模式adapter

    一.模式解析 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 也就是说,如果已经写好了一个接口,但是又来了一种截然不同的接口,如 ...

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

    一.概述在软件开发中,常常会想要复用一个已经存在的组件,但该组件的接口却与我们的需要不相符,这时我们可以创建一个适配器,在需复用的组件的接口和我们需要的接口间进行转换,从而能够正常的使用需复用的组件. ...

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

    简介: 适配器模式在我看来是最无聊的一种模式,因为他根本不是一种新的创意模式,而是一种不得已而为之的模式.就算不学适配器模式,在具体应用场景中也会自然而然的想到这种解决方案. 张三在英国留学时买了个笔 ...

  7. 大话设计模式--适配器模式 Adapter -- C++实现实例

    1.适配器模式: 将一个类的接口转换为客户希望的另一个接口,使得原来由于接口不能一起工作的那些类一起工作. 适配器模式一般用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 适配器模式分 ...

  8. [设计模式]适配器模式Adapter

    将一个类的接口转换成客户希望的另外一个接口. A d a p t e r模式使得原本 由于接口不兼容而不能一起工作的那些类可以一起工作.

  9. 设计模式(五)适配器模式Adapter(结构型)

      设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...

随机推荐

  1. SQL Split

    最初是根据数据ID批量删除数据,因为不知道到底是要删除多少条,而T-sql里也没有像C#中params这样方便的东西,所以想到字符串分割,但是发现T-sql中也没有提供字符串分割的函数,所以自己搜索了 ...

  2. Html5应用程序缓存ApplicationCache

    应用缓存机制可以参考http://www.w3school.com.cn/html5/html_5_app_cache.asp,不再赘述.利用此机制,html5游戏可以实现和native app类似的 ...

  3. Jade之Plain Text

    Plain Text jade提供了3种得到纯文本的方法. Piped Text 添加纯文本的一个最简单的方法就是在文本最前面加|符号即可. jade: p | It must always be o ...

  4. matlab资源

    百度网盘  链接:http://pan.baidu.com/s/1c06ikEW 密码:9dpt包含matlab6.5,7,7.01,7.04,7.1,Matlab2006b(7.3),Matlab  ...

  5. Python排列组合问题

    1.字符串的全排列 问题描述:打印出原字符串中所有字符的所有排列.——将输入字符串中的每个字符作为一个不同的字符看待,即使它们是重复的,如'aaa'应打印6次. Python可以用生成器解决: def ...

  6. Eclipse插件收集

    //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: [在Eclipse文件列表中打开文件所在 ...

  7. 访问控制public/protected/private的区别

    Java支持四种不同的访问权限: 修饰符 说明 public 共有的,对所有类可见. protected 受保护的,对同一包内的类和所有子类可见. private 私有的,在同一类内可见. 默认的 在 ...

  8. 成都印迹婚纱摄影 | yinjilove.com

    成都印迹婚纱摄影工作室 官方网站:http://yinjilove.com/ 联系方式:028-84278563 手机及微信号:18180642817 微信公众号:印迹摄影 地址:成都市锦江区牛王庙东 ...

  9. [转]c++中vector的使用

    C++中的vector使用范例 一.概述 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector是一个容器,它能够存放各种类型的对象,简 ...

  10. 前台传参数时间类型不匹配:type 'java.lang.String' to required type 'java.util.Date' for property 'createDate'

    springMVC action接收参数: org.springframework.validation.BindException: org.springframework.validation.B ...