.Net设计模式_适配器模式

时间:2023-03-09 05:35:06
.Net设计模式_适配器模式

引言:

有一次我看到一个朋友拿出一个三角型的东西,好奇的上去一看你,我勒个去,传说中的万能插口转接器(插口适配器)。

一面是插入口,集合了我认识的所有插口的形状,也有国内没看见过的;另一个是跟插座接触的,也是集合了我见过的所有样式,当然也有我没见过的。

问了下,这个三角型的东西,全世界通用(前提是跟他的另一个变压器一起使用)。这个东西老贵了,不算变压器,也要两张毛爷爷多。

而这就是现实生活中的适配器模式。

理解:

适配器,就是把原来两个不能一起使用的东西、模块、系统,通过中间的一个转化器,变成两个东西、模块、系统可以连接起来一起使用。

这个在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();
}

这两种模式的区别在于,接口的适配是没有默认实现的,所有的方法都是需要继承类自己实现的。
而对象模式是,可以有自己的实现的,这个其实就是抽象类和接口的区别吧。

总结:

1、 对象适配用处是,可以使Adaptee不必实现不需要的方法,具体就是其表现形式就是父类实现缺省方法,而子类只需实现自己独特的方法。
2、 适配器类可以是抽象类。
3、 带参数的适配器模式。使用这种办法,适配器类可以根据参数返还一个合适的实例给客户端。

应用场景:

1、 系统需要使用现有的类,而此类的接口不符合系统的需要。
2、 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3、 仅对对象适配器而言,在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

特别描述:

4、代码IUser _userObj = new UserAdapter();从耦合度来说这行代码的不符合要求,因为耦合度太高,所以需要我们设计时解耦。

解耦的方式是,使用反射和泛型的感念,来动态声明实例。

5、但是这里的Demo只是说明适配器模式,真真在设计时,如何使用适配器,肯定不是Demo中的那样。

代码下载:

百度云盘 http://pan.baidu.com/s/1bn6B7Z5

****  http://download.****.net/detail/hater22/6850527