1 适配器模式的定义
在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
2 实际应用中的例子
在生活中,我们买的手机充电器插头是2个孔的,但是我们买的插座只有三个孔的,此时我们就希望充电器的插头可以转换为三个孔的就好,这样我们就可以直接把它插在插座上,
此时三个孔插头就是客户端期待的另一种接口,自然两个孔的插头就是现有的接口,适配器模式就是用来完成这种转换的,具体实现代码如下:
类适配器模式实现
三角插座-现有的插头
/// <summary> /// 三角插头接口-现有的插座 /// </summary> public interface IThreeHole { /// <summary> /// 输出 /// </summary> void AdpatePrint(); }
双脚插头-用户期待的插头
1 /// <summary> 2 /// 两脚插头 3 /// </summary> 4 public abstract class TwoHole 5 { 6 public void Print() 7 { 8 Console.WriteLine("启用两脚插头..."); 9 } 10 }
适配器:
/// <summary> /// 适配器 /// </summary> public class AdpateManage : TwoHole,IThreeHole { public void AdpatePrint() { this.Print(); } }
测试:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 IThreeHole threeHole = new AdpateManage(); 6 threeHole.AdpatePrint(); 7 Console.ReadKey(); 8 } 9 }
三角插头(接口)期待执行 双脚插头的 Print() 方法,可以通过适配器继承三角插头接口双脚插头类,从而实现调度。
执行Print() 方法。
对象的适配器模式
上面都是类的适配器模式的介绍,然而适配器模式还有另外一种形式——对象的适配器模式,
这里就具体讲解下它的实现思路:既然现在适配器类不能继承TwoHole抽象类了(因为用继承就属于类的适配器了),但是适配器类无论如何都要实现客户端期待的方法的,即 AdpatePrint() 方法,
所以一定是要继承ThreeHole抽象类或IThreeHole接口的,然而适配器类的 AdpatePrint() 方法又必须调用TwoHole的 Print() 方法,又不能用继承,这时候就想,不能继承,
但是我们可以在适配器类中创建TwoHole对象,然后在Requst中使用TwoHole的方法了。正如我们分析的那样,对象的适配器模式的实现正式如此。下面就让我看看具体实现代码:
三角插座-现有的插头
/// <summary> /// 三角插头-现有的 /// </summary> public abstract class _ThreeHole { public virtual void AdpatePrint() { Console.WriteLine("三角插头工作中。。。。"); } }
双脚插头-用户期待的插头
/// <summary> /// 两脚插头-用户期待的 /// </summary> public class _TwoHole { public void Print() { Console.WriteLine("启用两脚插头..."); } }
适配器:
/// <summary> /// 适配器 /// </summary> public class _AdpateManage : _ThreeHole { /// <summary> /// 获取两脚插头对象 /// </summary> _TwoHole twoHole = new _TwoHole(); public override void AdpatePrint() { this.twoHole.Print(); } }
测试:
class Program { static void Main(string[] args) { _ThreeHole threeHole = new _AdpateManage(); threeHole.AdpatePrint(); Console.ReadKey(); } }
在以下情况下可以考虑使用适配器模式:
- 系统需要复用现有类,而该类的接口不符合系统的需求
- 想要建立一个可重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
- 对于对象适配器模式,在设计里需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。