惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
量子位
M
MIT News - Artificial intelligence
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google DeepMind News
Google DeepMind News
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
雷峰网
雷峰网
I
InfoQ
罗磊的独立博客
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
D
Docker
H
Hackread – Cybersecurity News, Data Breaches, AI and More
腾讯CDC
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
K
Kaspersky official blog
P
Privacy & Cybersecurity Law Blog
S
SegmentFault 最新的问题
T
Threat Research - Cisco Blogs
H
Help Net Security
小众软件
小众软件
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CERT Recently Published Vulnerability Notes
WordPress大学
WordPress大学
T
Tenable Blog
T
The Blog of Author Tim Ferriss
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - Franky
A
Arctic Wolf
T
Threatpost
Scott Helme
Scott Helme
C
Cybersecurity and Infrastructure Security Agency CISA
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
The Exploit Database - CXSecurity.com
G
GRAHAM CLULEY
Security Latest
Security Latest
Spread Privacy
Spread Privacy
L
LINUX DO - 热门话题
V
Vulnerabilities – Threatpost
P
Privacy International News Feed
S
Schneier on Security
Latest news
Latest news
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com

博客园 - Jimmy Zhang

为什么互联网这么卷? Kafka 分布式消息系统 欢迎访问我的独立博客 tracefact.net (2019.1.30) Webpack入门 《.NET之美》消息及勘误 .Net 项目代码风格要求 .NET框架 C#中的泛型 Asp.Net 用户验证(自定义IPrincipal和IIdentity) 从一个范例看XML的应用 [编]使用AutoCompleteExtender实现文本框自动匹配 [编]使用CascadingDropDown实现级联式下拉框 Asp.Net Ajax的两种基本开发模式 四种简单的排序算法 .Net中的加密解密 一步步构建“半自动”数据分页模块 C#网络编程(接收文件) - Part.5 C#网络编程(订立协议和发送文件) - Part.4 C#网络编程(异步传输字符串) - Part.3
Adapter模式
Jimmy Zhang · 2008-10-02 · via 博客园 - Jimmy Zhang

Adapter模式

引言

生活中有很多Adapter的例子。比方说,你买了一款舒适、手感极佳的键盘,它是P/S接口的,然而你的新式电脑已经淘汰了P/S接口,只提供USB接口。此时,为了能够使用这款键盘,就需要一个转接头,它的一头是P/S接口的,用来连接键盘;另一头是USB的,用来连接电脑。类似这样的转接头就充当一个Adapter的作用。类似的例子还有电源的三相/两相 转接头等等。

 Adapter模式应该是设计模式中一个轻量级的模式,实现起来也比较简单,有时候不经意中,你可能就已经实现了一个Adapter模式,只是自己没有发现而已。本文将通过一个范例介绍 Adapter模式。

Shape范例

很多编程的书籍中都喜欢使用一个Shape作为范例讲述面向对象中的继承,尽管这里我们讲述的是Adapter模式,但是并不妨碍我们也使用这个Shape的例子。考虑下面一幅关系图:

在这幅图中,Shape抽象类定义了Draw()方法,用于在屏幕上绘制图形,Square和Circle继承了Shape类,并实现了Draw()方法。另一个与Shape相关联的类Window,它的Initialize()方法接受一个Shape类型的参数,并调用其Draw()方法(实际中还可能进行其他操作,这里的关键是方法的签名只接受一个Shape类型的参数)。

public void Initialize(Shape s)

现在考虑这样一种情况:假如我们从第三方获得了另一个类XTriangle,而它并没有Draw()方法,只有一个完成同样功能的Display()方法。很显然,这个类也不会继承自Shape基类,我们也无法对其进行修改。此时。如果我们想让客户程序Window类使用XTriangle类,就不得不再重载一个Initialize()方法,让它接受一个XTriangle类型的参数。但这是治标不治本的方法,因为可能有很多类似Window的类,它们都只接受Shape类型,对每一处都进行修改显然是不切实际的。此时,通常的办法是创建一个包装(Wrapper)类,让这个包装类继承自Shape,同时让它含有一个对XTriangle的引用,并且将Draw()方法的实现委托给XTriangle.Display()去完成。我们将这个包装类命名为Triangle,而这种模式或者解决类似问题的方法,就称为Adapter模式。注意在很多情况下我们会将Triangle命名为TriangleAdapter,但这里命名为Triangle会更清晰一些,但它仍是一个Adapter。下面是类图:

接下来我们看下来看一下Triangle的实现:

public class Triangle : Shape {

    private XTriangle triangle;

    public Triangle(XTriangle triangle) {
        this.triangle = triangle;
    }
    public override void Draw() {
        triangle.Display();
    }
}

OK,这样就实现了Adapter模式,它的正式定义是:将一个类(XTriangle)的接口转换为客户端(Window)所期待的另一接口(Shape)。Adpater能够让各个类之间相互协作,而不受不兼容接口的影响。

总结

这篇文章通过一个简短的范例演示了Adatper模式,通过创建一个包装类,解决了在引入第三方类时接口不兼容的问题。感谢阅读,希望这篇文章能给你带来帮助。