除非你还在写 Java,否则设计模式真没多大用处。

—- 补充几句 —-

首先明确一点,这里说的“设计模式”,是“面向对象设计模式”的简称,以 GoF 书中列出的 23 个模式为代表。
不要把什么都归为模式,比如 “if-then-else 模式”、“for each 模式”就不是(面向对象设计)模式。Like, the inverse, reverse, double-back-flip pattern—whatever. Oh, you mean a loop? OK. — Jamie Zawinski
类似的,thread pool、thread-per-connection、process-per-connection、thread local storage、scoped locking、readers-writer lock 等等也不是面向对象设计模式。

赞同 @winter 说的 “建议不要泛泛地讨论和学习‘设计模式’,而是具体到每一个模式。”

如果你用的语言能把类型像变量一样赋值并传来传去,很多创建型模式就没用了。
如果你用的语言能把函数像变量一样赋值并传来传去,很多行为模式就没用了。
如果你用的语言 style 反对叠床架屋的 class hierarchy,很多结构模式就没用了。

几个简单具体的代码示例:

1. C# 内置了 delegate/event,Observer 模式就没用了。

2. 如果你的语言的 typeof 操作符能得到 runtime type,那么 Prototype 模式就没用了。比如

class Base(object):
  pass

class Derived(Base):
  pass

def clone(x):
  return type(x)()

if __name__ == '__main__':
  d = Derived()
  print type(d)  # <class '__main__.Derived'>
  c = clone(d)
  print type(c)  # <class '__main__.Derived'>
  b = Base()
  print type(b)  # <class '__main__.Base'>
  a = clone(b)
  print type(a)  # <class '__main__.Base'>

3. 如果类型能像变量一样赋值和传递,Factory method 模式就没用了。比如

class Base(object):
  pass

class Derived(Base):
  pass

def getCreator(ty):
  def create():
    obj = ty()
    # initialize obj
    return obj
  return create

if __name__ == '__main__':
  d = getCreator(Derived)
  b = getCreator(Base)

  print type(d())  # <class '__main__.Derived'>
  print type(b())  # <class '__main__.Base'>
# 这个例子做作了一些,可以看第二个链接里的例子。

更多的例子见 http://norvig.com/design-patterns/design-patterns.pdf
http://cdn.oreillystatic.com/en/assets/1/event/12/_The%20Lack%20of_%20Design%20Patterns%20in%20Python%20Presentation.pdf

4. 如果函数能像变量一样赋值和传递,Command、Strategy 等模式就没用了。

5. EventHandler/ConcreteEventHandler 这种 callback API 风格在现代语言里基本绝迹,C++ 有 std::function、C# 有 delegate、连 Java 8 都有了 Lambda,更别说动态语言了。

6. 有的语言有全局变量,Singleton 模式就没用了。Singleton 身是最简单也最被滥用的模式。

7. 有的语言有 multiple dispatch,Vistor 模式就没用了。其实 Vistor 模式一直就没啥用。

— 完 —

本文作者:陈硕

【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)

此问题还有 21 个回答,查看全部。
延伸阅读:
什么是设计模式?
怎么通俗易懂地解释「交互设计是什么」?

分享到