Adapter 适配器模式
适配器模式:适配器模式允许将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。
面向接口编程的原则:尽量将程序之中的参数,返回值,变量全都使用接口来代替。
1:类适配器模式: 带来高耦合(不推荐)
2:对象适配器模式:送耦合(推荐)
适配器模式的应用:
在.net之中复用com对象:
--com对象不符合.net对象的接口
--需要使用tlbimp.exe来创建一个runtime callable wrapper(RCW)以使其能够符合.net对象的接口。
.net数据访问类(Adapter变体)
--各种数据库并没有提供Dataset接口
--使用dbDataAdapter可以将任何各种数据库访问到的数据适配到DataSet对象上
集合类中队现有对象的排序
--现有对象未实现IComparable接口
--实现一个排序适配器(继承IComarable接口),然后在其compare方法中对两个对象进行比较.
稳定部分:
变化部分:
主程序:
面向接口编程的原则:尽量将程序之中的参数,返回值,变量全都使用接口来代替。
1:类适配器模式: 带来高耦合(不推荐)
2:对象适配器模式:送耦合(推荐)
适配器模式的应用:
在.net之中复用com对象:
--com对象不符合.net对象的接口
--需要使用tlbimp.exe来创建一个runtime callable wrapper(RCW)以使其能够符合.net对象的接口。
.net数据访问类(Adapter变体)
--各种数据库并没有提供Dataset接口
--使用dbDataAdapter可以将任何各种数据库访问到的数据适配到DataSet对象上
集合类中队现有对象的排序
--现有对象未实现IComparable接口
--实现一个排序适配器(继承IComarable接口),然后在其compare方法中对两个对象进行比较.
稳定部分:
interface Istack // 客户期望的接口,这里被适配的对象是一个ArrayList对象
{
public void Push(object item);
public object Pop();
public object Peek();
}
{
public void Push(object item);
public object Pop();
public object Peek();
}
变化部分:
//对象适配器(推荐使用)
class AdapterA: Istack //适配对象
{
ArrayList adpatee; //被适配的对象
public AdapterA()
{
}
public void Push(object item)
{
adpatee.Add(item);
}
public object Pop()
{
return adpatee.RemoveAt(adpatee.Count - 1);
}
public object Peek()
{
return adpatee[adpatee.Count - 1];
}
}
//类适配器
class AdapterB: ArrayList,Istack //适配对象
{
public AdapterB()
{
}
public void Push(object item)
{
this.Add(item);
}
public object Pop()
{
return this.RemoveAt(this.Count - 1);
}
public object Peek()
{
return this[this.Count - 1];
}
}
class AdapterA: Istack //适配对象
{
ArrayList adpatee; //被适配的对象
public AdapterA()
{
}
public void Push(object item)
{
adpatee.Add(item);
}
public object Pop()
{
return adpatee.RemoveAt(adpatee.Count - 1);
}
public object Peek()
{
return adpatee[adpatee.Count - 1];
}
}
//类适配器
class AdapterB: ArrayList,Istack //适配对象
{
public AdapterB()
{
}
public void Push(object item)
{
this.Add(item);
}
public object Pop()
{
return this.RemoveAt(this.Count - 1);
}
public object Peek()
{
return this[this.Count - 1];
}
}
主程序:
//对象适配器优于类适配器
public static void Main()
{
AdapterA a = new AdapterA();
a.Pop();
a.Push(item);
a.Peek();
AdapterB b = new AdapterB();
b.Pop();
b.Push(item);
b.Peek();
}
public static void Main()
{
AdapterA a = new AdapterA();
a.Pop();
a.Push(item);
a.Peek();
AdapterB b = new AdapterB();
b.Pop();
b.Push(item);
b.Peek();
}