适配器模式
概述
将一个类的接口转换为客户希望的另外一个接口。适配器模式使得原本由于接口不兼容二不能一起工作的那些类可以一起工作。
一般来说,适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷。应用这种模式算是“无奈之举”。如果在设计初期,我们就能协调规避接口不兼容的问题,那这种模式就没有应用的机会了。
结构图
代码实现
对象适配器
客户端期待的接口
/// <summary> /// 客户端期待的接口 /// </summary> public interface ITarget { public void Request(); }
待适配的类
/// <summary> /// 待适配的类 /// </summary> public class Adaptee { public void SpecificRequest() { Console.WriteLine("特殊请求"); } }
适配器
/// <summary> /// 对象适配器 /// </summary> public class Adapter1 : ITarget { private Adaptee adaptee = new Adaptee(); public void Request() { adaptee.SpecificRequest(); } }
客户端
static void Main(string[] args) { ITarget target = new Adapter1(); target.Request(); Console.Read(); }
运行结果
类适配器
客户端期待的接口
/// <summary> /// 客户端期待的接口 /// </summary> public interface ITarget { public void Request(); }
待适配的类
/// <summary> /// 待适配的类 /// </summary> public class Adaptee { public void SpecificRequest() { Console.WriteLine("特殊请求"); } }
适配器
/// <summary> /// 类适配器 /// </summary> public class Adapter2 : Adaptee, ITarget { public void Request() { base.SpecificRequest(); } }
客户端
static void Main(string[] args) { ITarget target = new Adapter2(); target.Request(); Console.Read(); }
运行结果
优势
可以让任何两个没有关联的类一起运行。
提高了类的复用。
增加了类的透明度。
灵活性好。
使用场景
系统需要使用现有的类,而此类的接口不符合系统的需要。
通过接口转换,将一个类插入另一个类系中。
封装有缺陷的接口设计
统一多个类的接口设计
替换依赖的外部系统
兼容老版本接口
适配不同格式的数据
缺陷
过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
由于C#至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。