定义:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
目标接口(Target):客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口
需要适配的类(Adaptee):需要适配的类或者适配者类。
适配器(Adapter):通过包装一个需要适配的对象,把原接口转成成目标接口
如图:
当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式了,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配
对象适配器"通过组合除了满足"用户期待的接口,还降低了代码间的不良耦合。
缺省适配器模式是一种特殊的适配器模式,但这个适配器模式是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是"平庸"的实现,也就是说,这些方法都是空方法,而具体的子类都要继承此抽象方法。
优点:
1:通过适配器模式,客户端可以调用同一个接口,因而对客户端来说是透明的,这样做更简单,更直接,更紧凑。
2:复用了现存的类,解决了现存类和复用环境要求不一致的问题。
3:将目标类和适配者解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有的代码。
4:一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配者可以把适配者类和它的子类都适配到目标接口
缺点:
对于对象适配器来说,更换适配器的过程实现比较复杂。
1:系统需要使用现有的类,而这些类不符合系统的接口。
2:想要建立一个可以重用的类,用于与一些彼此直接没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3:两个类所做的事情相同或相似,但是具有不同接口的时候。
4:旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有得类的时候。
5:使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。
具体详细代码如下:
1 void Main() 2 { 3 Target target = new Adapters(); 4 target.Request(); 5 // Result : This Is general category 6 } 7 8 // 用户所期待的接口 9 public class Target 10 { 11 public virtual void Request() 12 { 13 Console.WriteLine("This is a general category"); 14 } 15 } 16 17 // 定义适配器类 : 就是我们现在定义的接口 18 public class Adaptee 19 { 20 public void SpecificRequest() 21 { 22 Console.WriteLine("This Is a Special category"); 23 } 24 } 25 26 // 定义适配器 : 用来将我们的接口转为用户所期望的接口 27 public class Adapter : Target 28 { 29 private Adapter adapter = new Adapter(); 30 public override void Request() 31 { 32 adapter.SpecificRequest(); 33 } 34 35 }