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

引言: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中的那样。

 

代码下载:

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

CSDN  http://download.csdn.net/detail/hater22/6850527

相关文章
相关标签/搜索