适配器设计模式的适应场景:
一般情况是上端固定,下端固定,下端功能不满足或跟上端不协调,使用适配器重新包一层(继承适配器接口,以满足上端需求,继承下层类,以调用方法),使下端代码能满足上端需求(欺骗,强行满足),即类适配器
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()方法),或者可以理解为,为所有的类提供了通用的实现方式