标签:style blog class code java tar javascript width color get art
概述
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
解决
即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
角色
目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
需要适配的类(Adaptee):需要适配的类或适配者类。
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
解读
UML
C#代码:
1 /// <summary> 2 /// 客户期望的接口 3 /// </summary> 4 interface Target 5 { 6 void Request (); 7 } 8 9 /// <summary> 10 /// 目标接口 11 /// </summary> 12 interface Adaptee 13 { 14 void SpecifRequest (); 15 } 16 17 /// <summary> 18 /// 适配器 19 /// </summary> 20 public class Adapter : Target 21 { 22 private Adaptee _adaptee; 23 24 public void Request() 25 { 26 _adaptee.SpecifRequest (); 27 } 28 29 /// <summary> 30 /// 通过重写接口调用目标接口事件 31 /// </summary> 32 /// <param name="adaptee"></param> 33 public Adapter(Adaptee adaptee) 34 { 35 _adaptee = adaptee; 36 } 37 }
实例:电源适配器转换<两圆口至三扁头转换>
UML
C#代码
1 /// <summary> 2 /// 德标插口 3 /// </summary> 4 public interface IDBSocket 5 { 6 void PowerByTowRound (); 7 } 8 9 /// <summary> 10 /// 国标插口 11 /// </summary> 12 public interface IGBSocket 13 { 14 void PowerByThreeFlat (); 15 } 16 17 public class DBScoket:IDBSocket 18 { 19 public void PowerByTowRound () 20 { 21 Console.WriteLine ("Power By Tow Round"); 22 } 23 } 24 25 public class GbScoket:IGBSocket 26 { 27 public void PowerByThreeFlat() 28 { 29 Console.WriteLine ("Power By Three Flat"); 30 } 31 } 32 33 /// <summary> 34 /// 适配器 35 /// </summary> 36 public class SocketAdapter:IDBSocket 37 { 38 private IGBSocket _gb; 39 40 public SocketAdapter (IGBSocket gbscoket) 41 { 42 _gb = gbscoket; 43 } 44 45 public void PowerByTowRound() 46 { 47 _gb.PowerByThreeFlat (); 48 } 49 } 50 51 52 public class Host 53 { 54 private IDBSocket _socket; 55 56 public Host(IDBSocket db) 57 { 58 _socket=db; 59 } 60 61 public void Power() 62 { 63 _socket.PowerByTowRound(); 64 } 65 }
总结
优点:
通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑
复用了现存的类,解决了现存类和复用环境要求不一致的问题。
将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口
缺点:
对于对象适配器来说,更换适配器的实现过程比较复杂。
适用场景
系统需要使用现有的类,而这些类的接口不符合系统的接口。
想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作
两个类所做的事情相同或相似,但是具有不同接口的时候
旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候
使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能
随笔
关键在于实现客户的预期接口,并在接口调用目标方法
标签:style blog class code java tar javascript width color get art
原文地址:http://www.cnblogs.com/hjqc/p/3701680.html