换句话说,是否存在用于模式的模式?
设计模式旨在提供一个结构,以便解决问题。在解决实际问题时,您必须考虑许多微小的问题解决方案变化,以查看是否有任何解决方案符合设计模式。特别是,您可能需要将问题或其解决方案概括,以使设计模式适用。
答案是:这是一门艺术。了解设计模式当然是重要的一步。习惯于此类事情的方法之一是研究设计模式的应用,而不仅仅是模式本身。看到同一模式的许多不同应用可以帮助您随着时间的推移更好地将任务映射到模式上。
我强烈推荐阅读O'Reilly的Head First Design Patterns。这本书可以解释这些模式如何在实际应用中使用。
我还想补充一点,不要试图在设计中过多考虑模式。相反,寻找可能需要模式来解决的“代码异味”。
模式背后的核心概念是大多数人没有掌握的。不要将它们视为数据结构或算法。
相反,将您的代码视为人们彼此发送消息,就像传递笔记或发送信件一样。每个对象都是一个“人”。
您组织“人”及其彼此发送消息的方式就是模式。
把问题反过来:你应该做的是"什么样式适合我的问题"。考虑一个非常简单的样式,查找数组中的元素。在C语言中,它大致如下:
把问题转化一下:你需要做的是“哪种模式适用于我的问题”。对于一个非常简单的模式,查找数组中的元素。在C语言中,它看起来像这样:
TYPE_t ary[SIZE] = // ... gets initialized somehow
size_t ix ; // Your index variable
for(ix=0; ix < SIZE; ix++){
if (ary[ix] == item) {
return ix ;
}
}
你不是在看代码然后想:“我可以在哪里使用它”,而是在看问题然后说:“我知道如何在数组中找到一个元素吗?”
对于更广泛的模式,它确实以相同的方式工作。你需要有许多不经常更改的数据结构的副本 --- 这使你想到了“享元”(Flyweight)模式。如果你需要一些可以存在于网络边界两侧的东西,那么你要考虑“代理”(Proxy)模式。
当你学习设计模式,特别是 GoF 的时候,问问自己:“什么情况需要使用这种模式?我以前见过这种模式吗?我以前的工作中能用到这个模式吗?在我的生活中哪里可以找到这个模式的例子?”
经验。学习它们的模式和实际应用示例。每次您做出设计决策时,请考虑您所知道的模式是否适用于它。随着时间的推移,您会变得更加熟练,并发现将模式应用于更广泛问题范围的新方法。
我发现另一本很棒的书:
重构到模式
通过展示何时、何地以及如何将现有代码改为模式,它让我更好地理解了这些概念,并且能够识别它们可以使用的地方。
你是如何学习使用if语句的呢?
我认为if语句就像一个更大的结构体,你需要了解其内部细节才能有效地使用它。if语句可以解决需要分支处理的问题,桥接模式也可以解决一类问题。我并不认为它们有什么不同。
如果你了解模式,它们就会成为你工具箱中的工具。当你面对一个任务时,你可以从你的工具中选择。此时,你应该已经很清楚哪个工具最适合解决特定的问题。这就是公式不再起作用,你需要进行实际工程工作的地方。
Rian van der Merwe在2012年6月为Smashing Magazine撰写了一篇优秀的文章,内容与设计模式相关。以下是一些重点。
设计模式有两个用处:
van der Merwe建议我们在以下情况下考虑打破模式: