• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > .NET适配器模式讲解

.NET适配器模式讲解

作者:Yangyi.He 字体:[增加 减小] 来源:互联网 时间:2017-05-11

Yangyi.He通过本文主要向大家介绍了.net设计模式,.net工厂模式,net模式,net模式和路由模式,路由器net模式等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

适配器模式简介:

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

适配器模式结构图:

引入实例进行说明:

以日志记录程序为Demo说明,在任何一套软件中都会有对应的日志管理模块,假如如果我们在开发软件中的日记记录采用第三方的日志组件进行日志记录,它采用的是Log.Write("写日志");的方式我们的程序在开发中,大量实例化日记记录对象,采用的Log.Write()方式进行日志记录,但是现在第三方的日志组件现在不免费了,需要收费了,于是我们打算使用一种新的日志管理模块,只不过它提供给我们的API接口是采用Log.WriteLog("新的写日志的方式");进行日志记录。这个时候问题就出现了,如何应对这种迁移的变化

类适配器模式

1.原来日志的接口,采用的是Write(“写日志”);方法

  /// <summary>
  /// 原来的日志记录接口
  /// </summary>
  public interface ILogTarget
  {
    /// <summary>
    /// 原来的写日志方法
    /// </summary>
    void Write(string info);
  }


</div>

2.然而现在的写日志的接口,采用的是WriteLog("写日志");里面实现了写日志的新的方式:将日志写到文件中,数据库中

  /// <summary>
  /// 抽象写日志类
  /// </summary>
  public abstract class LogAdaptee
  {
    /// <summary>
    /// 写日志
    /// </summary>
    public abstract void WriteLog(string info);
  }


</div>
  /// <summary>
  /// 写文件日志记录
  /// </summary>
  public class FileLog:LogAdaptee
  {
    /// <summary>
    /// 写日志到文件中
    /// </summary>
    public override void WriteLog(string info)
    {
      Console.WriteLine("记录到文本文件:"+info);
    }
  }


</div>
  /// <summary>
  /// 往数据库中写日志
  /// </summary>
  public class DatabaseLog:LogAdaptee
  {
    /// <summary>
    /// 重写写日志方法
    /// </summary>
    public override void WriteLog(string info)
    {
      Console.WriteLine("记录到数据库:"+info);
    }
  }
</div>

3.如何使用者两个新对象中的方式,替换原来的写日志的方式?

  /// <summary>
  /// 采用新的写日志的方式,写入到数据库中
  /// </summary>
  public class DatabaseLogAdapter:DatabaseLog,ILogTarget
  {
    /// <summary>
    /// 在重写ILogTarget接口中的的Write方法里面调用新的写日志的方式WriteLog
    /// </summary>
    public void Write(string info)
    {
      WriteLog(info);
    }
  }

  /// <summary>
  /// 采用新的写日志的方式,写入到文本文件
  /// </summary>
  public class FileLogAdapter : FileLog, ILogTarget
  {
    /// <summary>
    /// 在重写ILogTarget接口中的的Write方法里面调用新的写日志的方式WriteLog
    /// </summary>
    public void Write(string info)
    {
      this.WriteLog(info);
    }
  }
</div>

4.调用依据使用的原来写日志的方法,但是确实使用的新的写日志的方式:

  /// <summary>
  /// 类 适配器模式(Adapter Pattern)
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      ILogTarget dbLog = new DatabaseLogAdapter();
      dbLog.Write("程序启动成功");
      dbLog = new FileLogAdapter();
      dbLog.Write("程序启动成功");
    }
  }


</div>

对象适配器模式

1.方式采用的是类适配器的方式实现了新的日志功能的迁移变化,下面我们使用对象适配器,可以区别发现两种方式的特别之处。原来写日志的方法依旧不变:Write("写日志");

  /// <summary>
  /// 原来的日志记录接口
  /// </summary>
  public interface ILogTarget
  {
    /// <summary>
    /// 原来的写日志方法
    /// </summary>
    void Write(string info);
  }
</div>

2.现在的写日志的接口,采用的是WriteLog("写日志");里面实现了写日志的新的方式:将日志写到文件中,数据库中:

  /// <summary>
  /// 抽象写日志类
  /// </summary>
  public abstract class LogAdaptee
  {
    /// <summary>
    /// 写日志
    /// </summary>
    public abstract void WriteLog(string info);
  }

</div>
  /// <summary>
  /// 写文件日志记录
  /// </summary>
  public class FileLog:LogAdaptee
  {
    /// <summary>
    /// 写日志到文件中
    /// </summary>
    public override void WriteLog(string info)
    {
      Console.WriteLine("记录到文本文件:"+info);
    }
  }


</div>
  /// <summary>
  /// 往数据库中写日志
  /// </summary>
  public class DatabaseLog:LogAdaptee
  {
    /// <summary>
    /// 重写写日志方法
    /// </summary>
    public override void WriteLog(string info)
    {
      Console.WriteLine("记录到数据库:"+info);
    }
  }


</div>

3.上面我们添加了FileLogAdapter 类,DatabaseLogAdapter类,继承了FileLog,DatabaseLog, ILogTarget接口,重写Write方法里面调用新的写日志的方式WriteLog,使用这样的方式进行了迁移变化。下面使用对象适配:

  /// <summary>
  /// 对象适配,继承ILogTarget,里面有LogAdaptee抽象日志类对象。
  /// </summary>
  public class LogAdapter:ILogTarget
  {
    /// <summary>
    /// 抽象写日志类
    /// </summary>
    private LogAdaptee _adaptee;

    public LogAdapter(LogAdaptee adaptee)
    {
      this._adaptee = adaptee;
    }

    public void Write(string info)
    {
      _adaptee.WriteLog(info);
    }
  }


</div>

4.在程序中的调用:

  /// <summary>
  /// 对象适配器模式(Adapter Pattern)
  /// </summary>
  class Program
  {
    static void Main(string[] args)
    {
      ILogTarget dbLog = new LogAdapter(new DatabaseLog());
      dbLog.Write("程序启动成功");
      ILogTarget fileLog = new LogAdapter(new FileLog());
      fileLog.Write("程序启动成功");
    }
  }
</div>

比较两者的迁移变化,在类适配方式中,我们得到的适配器类DatabaseLogAdapter和FileLogAdapter具有它所继承的父类的所有的行为,同时也具有接口ILogTarget的所有行为,这样其实是违背了面向对象设计原则中的类的单一职责原则,而对象适配器则更符合面向对象的精神,所以在实际应用中不太推荐类适配这种方式。假设我们要适配出来的类在记录日志时同时写入文件和数据库,那么用对象适配器我们会这样去写:

  /// <summary>
  /// 对象适配,继承ILogTarget,里面有LogAdaptee抽象日志类对象。
  /// </summary>
  public class LogAdapter:ILogTarget
  {
    /// <summary>
    /// 抽象写日志类
    /// </summary>
    private LogAdaptee _adapteed;

    /// <summary>
    /// 抽象写日志类
    /// </summary>
    private LogAdaptee _adapteef;

    public LogAdapter(LogAdaptee adapteed, LogAdaptee adapteef)
    {
      this._adapteed = adapteed;




 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • .NET桥接模式讲解
  • .NET原型模式讲解
  • .NET适配器模式讲解
  • .NET装饰模式讲解
  • .NET建造者模式讲解
  • .NET建造者模式讲解

相关文章

  • 2017-05-11VS2015开发环境的安装和配置
  • 2017-05-11ASP.NET技巧:教你制做Web实时进度条
  • 2017-05-11IIS7伪静态web.config配置的方法和规则
  • 2017-05-11Asp.net 页面导航的几种方法与比较 分享
  • 2017-05-11ASP.NET性能优化之减少请求
  • 2017-05-11asp.net 安全、实用、简单的大容量存储过程分页第1/2页
  • 2017-05-11asp.net调用系统设置字体文本框的方法
  • 2017-05-11ASP.NET也像WinForm程序一样运行的实现方法
  • 2017-05-11asp.net Gridview行绑定事件新体会
  • 2017-05-11datagrid行内按钮(更新/删除等)操作实现代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • HttpWebRequest和HttpWebResponse用法小结
    • ASP.net Forms验证Demo第1/3页
    • Asp.net中防止用户多次登录的方法
    • ASP.NET笔记之 Repeater的使用
    • GridView中动态设置CommandField是否可用或可见的小例子
    • ASP.NET中页面之间传递值的几种方式整理
    • ASP.NET MVC5网站开发咨询管理的架构(十一)
    • asp.net中穿透Session 0 隔离(一)
    • DataSet 添加数据集、行、列、主键和外键等操作示例
    • 安装 VS2005 SP1 有关问题的解决办法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有