
适配器设计模式的适应场景:
一般情况是上端固定,下端固定,下端功能不满足或跟上端不协调,使用适配器重新包一层(继承适配器接口,以满足上端需求,继承下层类,以调用方法),使下端代码能满足上端需求(欺骗,强行满足),即类适配器
public class MyLuceneAdapter : MyLucene, ISqlHelper
{ public void Add()
{
base.Add();
} public void Delete()
{
base.Delete();
} public void Update()
{
//Console.WriteLine("根本没有实现");
//throw new NotImplementedException(); base.Delete();
base.Add(); } public void Search()
{
base.Search();
}
}
类适配器存在的问题是,下端也许存在不满足上端的方法,会抛出异常或提供假的实现方式,而上端并不知道
对象适配器:
1、建一个接口,约定适配器必须提供的方法(不满足的部分不约定)
public interface IPhone
{
void Call();
}
2、定义适配器,在适配器的初始化方法中传入接口,用接口调用约定的方法,统一实现未约定的方法(注意,适配器本身并未继承接口)
public class PhoneAdapter
{
private IPhone _IPhone;
public PhoneAdapter(IPhone iPhone)
{
_IPhone = iPhone;
} public void Call()
{
_IPhone.Call();//用接口调用约定的方法
} public void Message()
{
Console.WriteLine("Message");//统一实现未约定的方法
}
}
3、使类继承接口
3.1 满足约束的
public class Xiaomi : IPhone
{
public void Call()
{
Console.WriteLine("这里是{0}的Call", this.GetType());
} public void Message()
{
Console.WriteLine("这里是{0}的Message", this.GetType());
}
}
3.2不满足约束的(Dageda 本身并不没有Message功能)
public class Dageda : IPhone
{
public void Call()
{
Console.WriteLine("这里是{0}的Call", this.GetType());
}
}
4、使用时先初始化实现接口的类,然后在初始化适配器时,将实现接口的类传入,然后使用适配器调用类的方法
Dageda dageda = new Dageda();
PhoneAdapter phoneAdapter = new PhoneAdapter(dageda);
phoneAdapter.Call();
phoneAdapter.Message();
对象适配器相对于类适配器,为适配器提供了扩展性,但是会覆盖类本身的方法(适配器的通用方法Message()将会覆盖Xiaomi的Message()方法),或者可以理解为,为所有的类提供了通用的实现方式