0

0

.NET适配器模式讲解

高洛峰

高洛峰

发布时间:2016-12-20 13:12:52

|

1322人浏览过

|

来源于php中文网

原创

适配器模式简介:

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

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

适配器模式结构图:

适配器模式

引入实例进行说明:

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

类适配器模式

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

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

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

/// 
/// 抽象写日志类
/// 
public abstract class LogAdaptee
{
  /// 
  /// 写日志
  /// 
  public abstract void WriteLog(string info);
}
/// 
/// 写文件日志记录
/// 
public class FileLog:LogAdaptee
{
  /// 
  /// 写日志到文件中
  /// 
  public override void WriteLog(string info)
  {
    Console.WriteLine("记录到文本文件:"+info);
  }
}
/// 
/// 往数据库中写日志
/// 
public class DatabaseLog:LogAdaptee
{
  /// 
  /// 重写写日志方法
  /// 
  public override void WriteLog(string info)
  {
    Console.WriteLine("记录到数据库:"+info);
  }
}

   

云枫工作室企业网站源代码(.net)4.0
云枫工作室企业网站源代码(.net)4.0

云枫工作室企业网站源代码(.net)Version 4.0 是云枫工作室基于.net环境独立开发的一套适用于企业使用的企业网站系统。.net+access.网站使用了模板动态生成静态页面技术,前台页面是生成纯静态的。网站包括了信息管理,产品管理,新闻管理和在线留言。可以在后台设置网站名称,标题,关键字和网站描述。配置说明:服务器空间需要支持.net2.0,还要有可写的权限(这个是必要的,因为网站前

下载

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

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

   

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

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

   

对象适配器模式

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

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

   

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

/// 
/// 抽象写日志类
/// 
public abstract class LogAdaptee
{
  /// 
  /// 写日志
  /// 
  public abstract void WriteLog(string info);
}
/// 
/// 写文件日志记录
/// 
public class FileLog:LogAdaptee
{
  /// 
  /// 写日志到文件中
  /// 
  public override void WriteLog(string info)
  {
    Console.WriteLine("记录到文本文件:"+info);
  }
}
/// 
/// 往数据库中写日志
/// 
public class DatabaseLog:LogAdaptee
{
  /// 
  /// 重写写日志方法
  /// 
  public override void WriteLog(string info)
  {
    Console.WriteLine("记录到数据库:"+info);
  }
}

   

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

/// 
/// 对象适配,继承ILogTarget,里面有LogAdaptee抽象日志类对象。
/// 
public class LogAdapter:ILogTarget
{
  /// 
  /// 抽象写日志类
  /// 
  private LogAdaptee _adaptee;
 
  public LogAdapter(LogAdaptee adaptee)
  {
    this._adaptee = adaptee;
  }
 
  public void Write(string info)
  {
    _adaptee.WriteLog(info);
  }
}

   

4.在程序中的调用:

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

   

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

/// 
/// 对象适配,继承ILogTarget,里面有LogAdaptee抽象日志类对象。
/// 
public class LogAdapter:ILogTarget
{
  /// 
  /// 抽象写日志类
  /// 
  private LogAdaptee _adapteed;
 
  /// 
  /// 抽象写日志类
  /// 
  private LogAdaptee _adapteef;
 
  public LogAdapter(LogAdaptee adapteed, LogAdaptee adapteef)
  {
    this._adapteed = adapteed;
    this._adapteef = adapteef;
  }
 
  public void Write(string info)
  {
    _adapteed.WriteLog(info);
    _adapteef.WriteLog(info);
  }
}

   

调用:

/// 
/// 对象适配器模式(Adapter Pattern)
/// 
class Program
{
  static void Main(string[] args)
  {
    //同时写日志到文件和数据库
    ILogTarget dbLog = new LogAdapter(new FileLog(), new DatabaseLog());
    dbLog.Write("程序启动成功");
  }
}

   

如果改用类适配器:我们难道使用这样的写法达到目的?

public class DatabaseLogAdapter : DatabaseLog, FileLog, ILogTarget
{
  public void Write(string info)
  {
    this.WriteLog(info);
  }
}

   

结果肯定是不能的,一个类不能具有多个基类,这样写明细有错误。所有针对不同的情况,我们应该采用合适的方式去进行适配调度。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

相关专题

更多
PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

11

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

13

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

93

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

112

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

155

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

ECMAScript6 / ES6---十天技能课堂
ECMAScript6 / ES6---十天技能课堂

共25课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号