引言:ide
有一次我看到一个朋友拿出一个三角型的东西,好奇的上去一看你,我勒个去,传说中的万能插口转接器(插口适配器)。spa
一面是插入口,集合了我认识的全部插口的形状,也有国内没看见过的;另外一个是跟插座接触的,也是集合了我见过的全部样式,固然也有我没见过的。.net
问了下,这个三角型的东西,全世界通用(前提是跟他的另外一个变压器一块儿使用)。这个东西老贵了,不算变压器,也要两张毛爷爷多。设计
而这就是现实生活中的适配器模式。code
理解:对象
适配器,就是把原来两个不能一块儿使用的东西、模块、系统,经过中间的一个转化器,变成两个东西、模块、系统能够链接起来一块儿使用。blog
这个在IT项目中是常常碰到的问题,好比咱们须要在一个已有的系统平台中,加载咱们开发的模块系统,那么受权系统就须要用别人的,继承
这个时候咱们须要作一个适配器,把平台中的受权系统封装后,给咱们系统使用。接口
适配器模式,分两种:接口适配器和对象适配器。开发
代码示例:
接口适配器
// 第三方系统的操做 public class OperateUserInfo { public String OperateUser() { return "用户的姓名"; } }
// 获取用户信息接口 public interface IUser { String GetUserName(); } // 实现接口 public class UserAdapter : IUser { OperateUserInfo _opObj = new OperateUserInfo(); public string GetUserName() { return _opObj.OperateUser(); } }
static void Main(string[] args) { // 调用 IUser _userObj = new UserAdapter(); Console.WriteLine(_userObj.GetUserName()); Console.ReadLine(); }
对象适配器
public class User { public virtual String GetUserName() { return String.Empty; } } public class UserAdapter2 : User { OperateUserInfo _opObj = new OperateUserInfo(); public override String GetUserName() { return _opObj.OperateUser(); } }
static void Main(string[] args) { // 调用 IUser _userObj = new UserAdapter(); Console.WriteLine(_userObj.GetUserName()); Console.WriteLine("----"); // User _userObj2 = new UserAdapter2(); Console.WriteLine(_userObj2.GetUserName()); Console.ReadLine(); }
这两种模式的区别在于,接口的适配是没有默认实现的,全部的方法都是须要继承类本身实现的。
而对象模式是,能够有本身的实现的,这个其实就是抽象类和接口的区别吧。
总结:
一、 对象适配用处是,可使Adaptee没必要实现不须要的方法,具体就是其表现形式就是父类实现缺省方法,而子类只需实现本身独特的方法。
二、 适配器类能够是抽象类。
三、 带参数的适配器模式。使用这种办法,适配器类能够根据参数返还一个合适的实例给客户端。
应用场景:
一、 系统须要使用现有的类,而此类的接口不符合系统的须要。
二、 想要创建一个能够重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在未来引进的类一块儿工做。这些源类不必定有很复杂的接口。
三、 仅对对象适配器而言,在设计里,须要改变多个已有子类的接口,若是使用类的适配器模式,就要针对每个子类作一个适配器,而这不太实际。
特别描述:
四、代码IUser _userObj = new UserAdapter();从耦合度来讲这行代码的不符合要求,由于耦合度过高,因此须要咱们设计时解耦。
解耦的方式是,使用反射和泛型的感念,来动态声明实例。
五、可是这里的Demo只是说明适配器模式,真真在设计时,如何使用适配器,确定不是Demo中的那样。
代码下载: