【问题标题】:stream adapters in Stream Architecture流架构中的流适配器
【发布时间】:2019-11-18 16:38:48
【问题描述】:

下面是一张来自 C# 7.0 的 Nutshell 书中的图片:

Q1-从图中可以推断出只有 backing store 流,例如FileStream 可以直接“连接”到文件,但是我们不是可以直接使用 StreamReader/StreamWriter 来读/写文件吗?

Q2-书中还说:

适配器包装流,就像装饰器一样。然而,与装饰器不同的是,适配器本身并不是一个流。它通常完全隐藏面向字节的方法

但是图中的StreamReader/StreamWriter等不是被标记为流适配器吗?如果它们不被视为流,它们如何被称为“流适配器”?

【问题讨论】:

  • Q1) 为了让 StreamWriter / StreamReader 从文件中写入/读取,它们需要使用 FileStream 构造。 FileStream 本身可以直接从文件中写入/读取。 Q2)它们是适配器,因为您不能再将它们用作流,即您不能在GZipStream 中装饰StreamReader。但是,您可以使用另一个装饰器来装饰 GZipStream,因为装饰器本身就是一个 Stream 对象。
  • 重新审视“直接”这个词。 new StreamReader("file.txt") 在后台创建一个 FileStream。图片是对的。

标签: c# .net io


【解决方案1】:

如果它们不被视为流,它们如何被称为“流适配器”

杯架不能被视为杯子。

我们不是可以直接使用StreamReader/StreamWriter来读写文件吗?

StreamWriter/Reader 在内部使用 Stream。
来自源代码:https://github.com/microsoft/referencesource/blob/master/mscorlib/system/io/streamwriter.cs#L192

【讨论】:

    【解决方案2】:

    第一季度

    只有后备存储流直接连接到特定的 I/O 资源。您使用MemoryStream 将数据流读/写到内存。 StreamWriter 使用 例如MemoryStream 完成此任务。所以它不是直接访问 I/O 资源。当创建任何流适配器类型的实例(例如StreamWriter)时,您必须将后备存储流传递给构造函数(例如new StreamWriter(new MemoryStream())),然后适配器流使用该流来读取/写入特定资源。 StreamWriter 访问例如因此,文件或内存是间接的。读/写操作委托给底层的后备存储流。
    命名约定也表达了这种关系。它是 StreamReader 而不是 ReadableStream。它一个流中读取。它是 XMLWriter 而不是 XmlStream(或 FileStream)。

    第二季度

    适配器连接两个不兼容的接口或模块。在您的图形中,您可以清楚地看到流适配器的任务是连接例如简单的文本,XML 以字节表示为基础的流对象。适配器向消费者隐藏底层流详细信息。这允许您例如使用StreamWriter 以更方便的方式将普通的string 写入Stream,而不关心真正的字节表示(流本身只知道字节)。适配器知道如何转换不兼容的数据以使其兼容。这就是适配器的本质。因为它将流不兼容的数据输入/输出连接到实际流,所以它被称为“流适配器”。它适应流。

    装饰器扩展了被装饰对象的行为。它实现了装饰对象的基本类型并包装了一个实际的实现以扩展其行为。这允许在不违反开放封闭原则的情况下向现有对象添加功能。因此,当包装(装饰)对象被扩展(修改)时,包装(装饰)对象不会被修改。

    流适配器使用一个流,通过转换和委派数据给它。装饰器流是一个流并扩展了行为。

    Stream AdaptersStream Decorators 都是设计模式的实现:Adapter PatternDecorator Pattern

    【讨论】:

    • 所以 StreamWriter 不是流?
    • 没有。它是一个知道如何将string 转换为字节数组的适配器,以便可以将数据写入底层流。这是一个特殊的连接器。
    • 我现在要去拿一本设计模式的书来学习,请问Adaptive Code via C#是一本好书还是你能推荐一本?
    • 这是一个简单的包装器。装饰器也是一个包装器,但实现了被包装的基类来模仿被包装的类。
    • 是的,为什么不呢。你可以试试Design Patterns in C#GoF Design Patterns。互联网上到处都是电子书和文章。你不需要买一个。但是在架子上放一个总是好的。
    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2019-12-18
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多