适配器模式
将一个已有的服务器端应用接口转换成一个客户端程序所期望的接口。
模式涉及的角色有
目标接口(ITarget):所期待的接口,这里是类适配器模式,因此目标不可以是类。
源(Adaptee):需要适配的类
适配器(Adapter):在这里把源接口转换为目标接口,显然这一接口必须是具体的类。
意图
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
结构图
包括类适配器和对象适配器两种
1、类适配器
由于 Adapter 是 Adaptee的子类因此可以在Adapter中置换(override)掉Adaptee中的一些方法。但是对于类适配器,如果用此类适配源的子类就行不通了。即类适配器可以置换源的方法,对象适配器可以同时用于适配源的所有子类,反之则不容易。
2、对象适配器
这种做法很象货物的包装过程,被包装货物的真实样子被包装所掩盖和改变。因此有人把这种模式称为包装(Wrap)模式对象适配器的同一个适配器可以适配源也可以适配源的子类。但是与类适配器相比要想置换掉源类的方法就不容易,如果一定想置换掉源类的某一个方法就只好先做一个源类的子类,将源类的方法置换掉然后再把源类的子类作为真正的源进行适配。虽然置换掉源类的方法不容易,但是要增加一些新的方法则方便的很,而且新增加的方法同时适应所有的源及其子类。
//类适配器
namespace DesignPattern.Adapter.ClassAdapter
{
public interface ITarget
{
void SampleOperation1();
void SampleOperation2();
}
public class Adaptee
{
public void SampleOperation1()
{
}
}
public class Adapter : Adaptee,ITarget
{
public void SampleOperation2()
{
}
}
}
//对象适配器
namespace DesignPattern.Adapter.ObjectAdapter
{
public interface ITarget
{
void SampleOperation1();
void SampleOperation2();
}
public class Adaptee
{
public void SampleOperation1()
{
}
}
public class Adapter : ITarget
{
private Adaptee adaptee;
public Adapter(Adaptee adaptee)
{
this.adaptee=adaptee;
}
public void SampleOperation1()
{
this.adaptee.SampleOperation1();
}
public void SampleOperation2()
{
//write your code here
}
}
}
在这个例子中 adapter 补充了一个 adaptee 没有的方法 但不要误认为适配器就是补充源角色没有的方法而设计的。
缺省适配器模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有类型进行扩展。这样这个抽象类继承下去的子类就不必实现所有的方法了。新的类就是Adapter类而给出缺省实现的抽象类就可以被当作Adaptee。缺省适配器的目的与普通适配器的目的不同,它是为了方便建立一个不平庸的适配器类而提供的一种平庸实现。
namespace DesignPattern.DefaultAdapter
{
public interface IService
{
void ServiceOperation1();
string ServiceOperation2();
}
public abstract class ServiceAdapter : IService
{
public virtual void ServiceOperation1()
{
}
public virtual string ServiceOperation2()
{
return null;
}
}
}
标签:--,子类,Adapter,模式,public,void,Adaptee,适配器 From: https://blog.51cto.com/u_15739274/5947789