【问题标题】:Are there any design patterns used in the .NET Framework?.NET Framework 中是否使用了任何设计模式?
【发布时间】:2009-08-22 19:01:29
【问题描述】:

我想知道:.NET Framework 中是否使用了任何GoF 设计模式?

赏金:

我在答案中看到了下面的 MSDN 链接。是否有任何帖子/视频,或者您可以列出模式,最重要的是在哪里使用它?

【问题讨论】:

标签: .net design-patterns


【解决方案1】:

.NET 框架使用 许多 四人组模式。这里只是几个例子:

创作模式

  • 抽象工厂System.Data.Common.DbProviderFactory。这个类的每个成员函数都是一个工厂方法。
  • Builder:WCF 渠道建设基础设施。
  • 工厂方法
    • System.Data.IDbConnection.BeginTransaction()。创建的事务类型取决于底层 IDbConnection 实现。
    • WebRequest.Create() 返回取决于 URL 方案的具体类型。
  • 原型 - 用于克隆和序列化框架
  • 单例 - 用作 WCF 中的激活方法,即 Web 服务可能被 WCF 基础结构视为单例。 .NET 远程处理也是如此。

结构模式

  • 适配器:ADO.NET 提供程序,例如System.Data.SqlClient.SqlConnectionSystem.Data.OleDb.OleDbConnection 等。每个提供程序都是其特定数据库的适配器。
  • 复合:很多例子
    • System.Windows.Forms.Control 及其派生类。
    • System.Web.UI.Control 及其派生类。
    • System.Xml.XmlNode 及其派生类。
  • 装饰器
    • System.Windows.Controls.Decorator(在 WPF 中)。
    • Stream 的一些实现是围绕内部流的装饰器(例如 GZipStreamCryptoStream)。
  • 外观System.Xml.Serialization.XmlSerializer。 XmlSerializer 在一个非常易于使用的类后面隐藏了一项复杂的任务(包括动态生成程序集!)。
  • 代理:由 svcutil.exe 生成并派生自 System.ServiceModel.ClientBase<TChannel> 的 Web 服务代理

行为模式

  • 责任链System.Web.UI.Control.OnBubbleEvent()System.Web.UI.Control.RaiseBubbleEvent()
  • 命令System.Windows.Input.ICommand(在 WPF 中)。
  • 口译员System.Linq.Expressions.Expression 和相关类。
  • 迭代器:很多例子
    • System.Collections.IEnumerable
    • System.Collections.Generic.IEnumerable<T>
    • System.Data.IDataReader
  • Memento:.NET Serializable 模式是 Memento 模式的变体。
  • 观察者 - .NET 事件机制。
  • 策略 - ArrayList 中的排序方法
  • 模板方法 - 自定义控件的渲染方法
  • 访客System.Linq.Expressions.ExpressionVisitor (used internally by [LINQ])

【讨论】:

  • 正是我要搜索的内容。。谢谢 但是具有 MoveNext() 方法的迭代器模式 IEnumerator 的具体示例是什么?
  • @Ananth -- 我会说是的。 IEnumerator 是迭代器模式,IEnumerable 是最常见的消费方式。
【解决方案2】:

这是一篇讨论这个主题的文章:

Discover the Design Patterns You're Already Using in the .NET Framework

现在可以使用 ASP.NET MVC 添加 MVC 模式。 :)

编辑:由于您的编辑/请求更多信息:

这是一篇文章,列出了几种模式以及它们在框架中的使用位置。
Structural Design Patterns and .NET Framework 2.0

.NET中的Providers都是Provider模型模式:
ASP.NET 2.0 Provider Model: Introduction to the Provider Model

.NET 中的提供者模式也使用策略模式。

工厂模式在多个地方使用,这里是一个在 ASP.NET 中使用的示例。
Exploring the Factory Design Pattern

这是 .NET 中 DP 的网络广播:
MSDN Webcast: Design Patterns in .NET

我还没有看过,所以我不确定它们在框架中的使用方式有多大...

正如评论中已经提到的,GoF 模式可能都在 .NET 框架中使用。哪里不是最容易回答的,因为框架很大,除非 MS 在某些示例中列出这样的内容,否则它并不总是显而易见的。对模式越熟悉,您就越有可能注意到正在使用它的框架类。

希望我添加的额外链接对您有所帮助。

此外,dofactory 有一个 for sale kit ($79-99),它是关于教授如何在 .NET 中使用/实现 GoF 模式,但他们在阅读材料中列出了它们还将解释 MS 在框架中使用它们的位置。

【讨论】:

  • 我讨厌这样的列表。绝大多数 GoF 设计模式都不适合 .NET 程序员。有更好的模式可以解决相同的目标,但使用 .NET 平台提供的功能来实现。不幸的是,它们没有花哨的名字,因此在文学作品中往往被忽视。
  • 只是给他他所要求的。 :)
  • @Grauenwolf 和@Paco:Paco 认为可能所有这些都是,但 Grauenwolf 认为大多数可能不合适。我感觉 Grauenwolf 更接近于正确,但我很想听到关于 Grauenwolf 立场的讨论或此类讨论的链接。或者你能说出一两个不合适的模式吗?为什么?
  • 例如,传统的“观察者”和“策略”模式通常用其他语言的接口和类来实现,在 .Net/C# 中用委托实现更好
  • “访客”模式是我特别不喜欢的一种。该设计假设您可以在创建新类之后修改接口。但当然我们都知道 .NET 中的接口在发布后就永远不应该更改。
【解决方案3】:

阅读“框架设计指南:可重用 .NET 库的约定、惯用语和模式”。本书将向您展示 .NET 所基于的真正设计模式。

【讨论】:

  • 我想建议一个... :)
  • 第二个!这是第一版的第 9 章(“通用设计模式”)——我把那个副本放在家里,第二版放在工作中。 :)
  • +1:我有这本书的第二版。它确实提供了如何设计框架的深刻见解,并且确实给出了一些示例,其中给出了 .Net 框架的各个部分是如何设计的。
  • 没有回答问题。
【解决方案4】:

当然。例如,Factory 模式 用于 ADO.NET 数据提供程序类。 单例模式用于 .NET 远程处理。 Dispose 模式用于资源管理。

【讨论】:

    【解决方案5】:

    BCL 中的 BeginXXX 和 EndXXX 方法松散地基于 Asynchronous Completion Token 模式。

    【讨论】:

      【解决方案6】:
      • System.Net.WebClient 是外观模式的一个示例。
      • System.IO.Stream:经典异步模式
      • System.ComponentModel.BackgroundWorker:基于事件的异步模式
      • 如前所述:框架中几乎所有地方都使用了 Dispose 模式
      • System.Control:模板方法模式

      【讨论】:

        【解决方案7】:

        是的,.Net 框架 BCL 中使用了许多设计模式。事实上,这是从实际角度了解设计模式用法的最佳场所。

        模式:实施

        观察者模式:实现为事件和委托

        装饰器模式:在 System.IO Stream 类中实现

        迭代器模式:IEnumerable & Iterator

        策略模式:通过 Lambda 表达式查询(list.Where(expression))在 Linq 中实现

        工厂模式:在 System.Net.WebRequest 中

        适配器模式:TLB 导入/RCW(运行时可调用包装器)

        请观看此视频,了解有关此主题的详细介绍。

        https://www.youtube.com/watch?v=riHGGYHVoaQ&list=PL2_Cl8E2bG36PGuBGesHFPVM1s6M02JmN

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-24
          • 1970-01-01
          • 1970-01-01
          • 2011-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多