骄傲是胜利下的蛋 但孵出来的确是失败
「1」说明
此乃《设计模式》之适配器模式
「2」适配器模式定义
适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
「3」何时使用适配器模式和优点
- 使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式。两个类所做的事情相同或者相似,但是具有不同的接口时要使用适配器模式。客户代码可以统一调用同一接口就行了,可以更简单、更直接、更紧凑。
- 系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
- 注意:要在双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同时就使用它。
「4」适配器模式(Adapter)结构图
Target类:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
Adaptee类:需要适配的类
Adapter类:通过在内部包装一个Adaptee对象,把原接口转换成目标接口
Client类:客户端调用类
「5」适配器模式(Adapter)代码推演
- Target类:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
class Target
{
public virtual void Request()
{
Console.WriteLine("普通请求!");
}
}
- Adaptee类:需要适配的类
class Adaptee
{
public virtual void SpecificRequest()
{
Console.WriteLine("特殊请求!");
}
}
- Adapter类:通过再内部包装一个Adaptee对象,把原接口转换成目标接口
class Adapter : Target
{
private Adaptee adaptee = new Adaptee;
public virtual void SpecificRequest()
{
Adaptee.SpecificRequest();
}
}
- Client类:客户端调用类
static void Main(string[] args)
{
Target target = new Adapter();
target.Request();
Console.Read();
}
「6」适配器模式(Adapter)总结
在.NET中有一个类库已经实现的、非常重要的适配器,那就是DataAdapter。DataAdapter用作DataSet和数据源之间的适配器以便检索和保存数据。DataAdapter通过映射Fill(这更改了DataSet中的数据以便与数据源中的数据相匹配)和Update(这更改了数据源中的数据以便于DataSet中的数据相匹配)来提供这一适配器。由于数据源可能来自SQL Server,可能来自Oracle,也可能来自Access、DB2,这些数据在组织上可能有不同之处,但我们希望得到统一的DataSet(实质是XML数据)。此时DataAdapter就是非常好的手段,我们不必关注数据库的数据细节,就可以灵活地使用数据。
如果能够事先预防接口不同的问题,不匹配问题就不会发生;在有小的接口不统一问题发生时,及时重构,问题不至于扩大;只有碰到无法改变原有设计和代码的情况时,才考虑适配。
事后控制不如事中控制,事中控制不如事前控制。