设计模式学习为什么要采用设计模式

      如今,软件开发已经有了巨大的变化。一个主要的变化就是结构化编程的介绍,结构化编程把应用程序分成很多功能,
每一个功能执行一个特定的任务,每个功能都要因它将要执行的任而被命名,紧接着就是用面向对象的方式编程。使 C++ 和 smalltalk
变得很流行,现在开发者都依赖类来写他们的代码,用这些从现实中模型化过的类来编程。

      这些方法的主要目标都是帮助在团队内部或跨团队的沟通。“一个客户是怎么开户的?” 使得一个开发者和另一个
开发者和终端用户沟通起来非常容易。然后用类来模型化。

      最近几年在开发者社区看到“设计模式”的兴起, 设计模式所要讲的就是沟通,它帮助开发者更好的明白和更
清晰的描述一段被给出的代码。

设计模式和沟通

     设想有两个木匠,他们在讨论如何连接去使用一组抽屉,一个人问:“ 你准备用什么顺序连接这些抽屉”
另一个答道 “我要拿两块木头,砍掉大约两厘米,在四十五厘米深度打角,然后再在四十五深度砍掉四厘米,然后
上下四十厘米处,然后......”

     第二个人要描述的是如何去燕尾接合,在木工中是一个标准的接合方式,这样的描述不是目标沟通,实际上他隐藏了
沟通,如果第二个人说“我要使用一个燕尾接合” 那就会传递更多信息用很少的话。

     在第二个例子中,木工正在描述一个正常的连接方式,并且基于他们的理解做出的描述。 例如每一个复杂的结合,
结合的力度等等。

     这就是软件开发中设计模式应用的情况,如果一个开发者说 “我在使用一个策略模式” 或 “我在使用一个工厂模式”
传递给另外一个理解这个模式的并且知道如何使用的开发者。

什么是模式

     模式不是描述代码,替代的,它允许开发者之间通过去沟通问题的机制来使得问题得以解决。模式是对一个通用设计
问题可以复用的解决方式。

     对于许多模式来讲, UML 图的描述可能不能全部描述清楚模式,例如,代理模式 和 “Decorator” 模式公用一个UML
图,但是它们本质是不同的,这是我们学习模式的一个关键概念之一,这就是为什么和什么时候一个特定的情形应该
被应用。

     命名也是非常重要的,许多人把创建了一些事的代码叫做工厂,然而不是每一个创建者都是一个工厂,笼统地叫工厂不能表达
正确的讯息,实际上有两种不同的工厂模式,工厂方法和抽象工厂方法,明白模式之间的不同和理解不是所有的创建
者都叫工厂,这有助于利用模式名称帮助开发者沟通。

设计规范

      好的OO设计要遵循一定的规范,并使用模式支持这些规范,例如 允许一个更加灵活的开发者去面向接口编程,而不是
一个实现,这里提到的“接口”不只是接口的关键字,并且也指一个抽象类,许多设计模式遵循“开/关”规则,开是为了扩
展性,关是为了修改。因此,当测试过的代码不该改变的时候,新代码应该在排除在外。例如,策略模式允许运行时代码
提供,.net Array.sort类就是这样的例子,排序法则不能被物理的修改但是你可以为他提供用来比较items的法则。
因此,代码是对修改关闭着的,但是它能够被扩展到比较不同类型的实体。


在.net 中应用模式

     许多文献材料都是围绕特定读者编撰的,java 开发者, java 和 .net 很相像, 开发者经常把应用在java 的设计模式移植到
C# 或  VB.net 然而,java 和.net 不是相同的环境,即使它们有相同的roots,例如.net 有代理,java 没有,.net (至少在c#) 有匿名
方法,但是 java 没有,这些技术都能够被应用到许多设计模式中,使得用C#和java写的模式基本不同,理解C#的特征是准确
使用设计模式在.net 中的一个关键.

     使用.net 特征改变我们使用一些通用模式的方式,例如,使用代理来实现观察者模式,使用State 模式和partial 类结合,将允许
我们把代码放到多个文件中,每个state 用一个文件包含一个类,使它更容易管理代码,使用 ThreadStatic 意味着 线程绑定 单件模式
将更容易创建,其他的可以被用于设计模式的技术还有.net 的迭代器和透明代理.


总结

模式在开发者沟通之间提供了一机制,允许开发者在更高的层次沟通而不是代码层面 并且目标是理解被开发的代码
模式能够被适用于其被应用得环境,特别的能利用许多.net的特征如 委托 ,partial 类,和匿名方法.



原文地址:https://www.cnblogs.com/flyinthesky/p/1218395.html