设计模式之美:Adapter(适配器)
索引
别名
- 包装器(Wrapper)
意图
将一个类的接口转换成客户希望的另外一个接口。
Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Convert the interface of a class into another interface clients expect.
Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.
结构
类适配器使用多重继承对一个接口与另一个接口进行匹配。
对象适配器依赖于对象组合。
参与者
Target
- 定义 Client 使用的与特定领域相关的接口。
Client
- 与符合 Target 接口的对象协同。
Adaptee
- 定义一个已经存在的接口,这个接口需要适配。
Adapter
- 对 Adaptee 的接口与 Target 接口进行适配。
适用性
在以下情况下可以使用 Adapter 模式:
- 你想使用一个已经存在的类,而它的接口不符合你的需求。
- 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。
- 你想使用一些已经存在的类,但是不可能对每一个都进行子类化匹配它们的接口。对象适配器可以适配它的父类的接口。
效果
- 允许一个 Adapter 与多个 Adaptee (Adaptee 本身及它的子类)同时协同。Adapter 也可以一次给所有的 Adaptee 添加功能。
- 使得重定义 Adaptee 的行为比较困难。这就需要生成 Adaptee 的子类并且使得 Adapter 引用这个子类而不是引用 Adaptee 自身。
相关模式
- Bridge模式的结构与对象 Adapter 模式类似,但是 Bridge 模式的出发点不同:Bridge 目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而 Adapter 则意味着改变一个已有对象的接口。
- Decorator模式增强了其他对象的功能而同时又不改变它的接口。因此 Decorator 对应用程序的透明性比 Adapter 要好。结果是 Decorator 支持递归组合,而 Adapter 无法实现这一点。
- Proxy模式在不改变它的接口的条件下,为另一个对象定义了一个代理。
实现
实现方式(一):简单直接的对象适配器。
namespace AdapterPattern.Implementation1
{
public class ParentAdaptee
{
public virtual string SpecificRequest()
{
return "ParentAdaptee";
}
} public class ChildAdaptee : ParentAdaptee
{
public override string SpecificRequest()
{
return "ChildAdaptee";
}
} public class Target
{
public virtual string Request()
{
return "Target";
}
} public class Adapter : Target
{
private ParentAdaptee _adaptee; public Adapter(ParentAdaptee adaptee)
{
_adaptee = adaptee;
} public override string Request()
{
return _adaptee.SpecificRequest();
}
} public class Client
{
public void TestCase1()
{
ParentAdaptee adaptee = new ChildAdaptee();
Target target = new Adapter(adaptee);
var result = target.Request();
}
}
}
实现方式(二):实现双向类适配器。
namespace AdapterPattern.Implementation2
{
public class ParentAdaptee
{
public virtual string SpecificRequest()
{
return "ParentAdaptee";
}
} public class ChildAdaptee : ParentAdaptee
{
public override string SpecificRequest()
{
return "ChildAdaptee";
}
} public interface ITarget
{
string Request();
} public class Adapter : ChildAdaptee, ITarget
{
public Adapter()
{
} public string Request()
{
return base.SpecificRequest();
}
} public class Client
{
public void TestCase2()
{
ITarget target = new Adapter();
var result = target.Request();
}
}
}
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
设计模式之美:Adapter(适配器)的更多相关文章
- Ruby设计模式透析之 —— 适配器(Adapter)
转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...
- 设计模式之美:Structural Patterns(结构型模式)
结构型模式涉及到如何组合类和对象以获得更大的结构. 结构型类模式采用继承机制来组合接口实现. 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法. 因为 ...
- 设计模式之美:Extension Object(扩展对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用示例结构实现 Extension Object. 实现方式(二):使用泛型实现 IExtensibleObject<T ...
- 设计模式之美:Proxy(代理)
索引 别名 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用相同 Subject 接口实现 Proxy. 别名 Surrogate 意图 为其他对象提供一种代理以控制对这个对象的 ...
- 设计模式之美:Decorator(装饰)
索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 实现 实现方式(一):Decorator 对象的接口必须与它所装饰的 Component 的接口保持一致. 实现方式(二):省略抽象的 D ...
- 设计模式之美:Bridge(桥接)
索引 别名 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用 Bridge 模式分离抽象部分和实现部分. 别名 Handle Body 意图 将抽象部分与它的实现部分分离,使它们 ...
- Android中ListView 控件与 Adapter 适配器如何使用?
一个android应用的成功与否,其界面设计至关重要.为了更好的进行android ui设计,我们常常需要借助一些控件和适配器.今天小编在android培训网站上搜罗了一些有关ListView 控件与 ...
- 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)
原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...
- 8.3 GOF设计模式二: 适配器模式 Adapter
GOF设计模式二: 适配器模式 Adapter 为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式 SingleTon的三个关键点 ...
随机推荐
- XidianOJ 1172 Hiking
题目描述 BlacKin and GKCY are going hiking together. Besides their personal items, there are some items ...
- 关于mysql 的一些零碎.
/* 又在做自己以前做的事.总是拿以前的眼光来看现在,导致了其实自己已经很low,但是还觉得自己很xxx. 好吧,最近开始PHP审计.jishigou!!!!!! */ 查看日志情况. show va ...
- JavaWEB域对象
PageContext: ServletRequest: HttpSession: ServletContext: void setAttribute(String name, Object valu ...
- SQLServer 命令批量删除数据库中指定表(游标循环删除)
DECLARE @tablename VARCHAR(30),@sql VARCHAR(500)DECLARE cur_delete_table CURSOR READ_ONLY FORWARD_ON ...
- 新手接触java
第二个程序,求同时被3,5,7整除
- poj 3368 Frequent values(RMQ)
/************************************************************ 题目: Frequent values(poj 3368) 链接: http ...
- andorid service 本地服务
ActivityManifect.xml <?xml version="1.0" encoding="utf-8"?> <manifest x ...
- jquery实现标签上移、下移、置顶
eg:如在后台的标签列表中,实现上移.下移.置顶功能 思路: 1.先用到的克隆方法.clone(true): 即把当前要移动的项先保存好,备于后用. 2.找到当前标签所对应的相关元素及其相关方法: 如 ...
- Android Preference使用
Android Preference经常使用在例如设置的功能,Android提供preference这个键值对的方式来处理这种情况,自动保存这些数据,并立时生效,这种就是使用android share ...
- BHP编译器教程
BHP编译器教程 BHP是一个WEB模版编程语言编译器,生成PHP后端代码. 最简单的Helloworld例子 编写一个hello.bhp文件 <? $hello="hello,wor ...