Design Patterns 设计模式
什么是设计模式?
设计模式是软件设计中常见问题的典型解决方案。 它们就像预制的蓝图,可以对其进行自定义,以解决代码中反复出现的设计问题。
我们不能像使用现成的函数或库那样,仅仅找到一个设计模式,并将其复制到我们的程序中。 设计模式不是一段特定的代码,而是用于解决特定问题的一般概念。 我们可以遵循设计模式的细节并实施适合自己程序实际情况的解决方案。
设计模式经常与算法混淆,因为这两个概念都描述了一些已知问题的典型解决方案。 虽然算法总是定义一组可以实现某个目标的明确动作,但设计模式是对解决方案的更高级的描述。 相同设计模式应用于两个不同程序的代码可能不同。
算法的类比是烹饪食谱:两者都有实现目标的明确步骤。 另一方面,模式更像是一个蓝图:您可以看到结果及其特征,但具体的实现顺序取决于您。
设计模式的历史
谁发明了设计模式?这是一个很好但不太准确的问题。设计模式并不是晦涩、复杂的概念 —— 恰恰相反。模式是面向对象设计中常见问题的典型解决方案。 当一个解决方案在各种项目中一遍又一遍地重复时,最终有人会为其命名并详细描述该解决方案。 这基本上就是模式被发现的方式。
Christopher Alexander 在 A Pattern Language: Towns, Buildings, Construction 中首先描述了模式的概念。 这本书描述了一种设计城市环境的“语言”。 这种语言的单位是模式。 他们可能会描述窗户应该有多高、建筑物应该有多少层、社区中应该有多大的绿地,等等。
这个想法被四位作者采纳:Erich Gamma、John Vlissides、Ralph Johnson 和 Richard Helm。 1994 年,他们出版了 Design Patterns: Elements of Reusable Object-Oriented Software,其中他们将设计模式的概念应用于编程。 这本书以解决面向对象设计的各种问题的 23 种模式为特色,并很快成为畅销书。 由于它的名字很长,人们开始称它为“四人帮的书”,后来简称为“GoF 书”。
从那时起,已经发现了许多其他面向对象的模式。 “模式方法”在其他编程领域变得非常流行,因此现在在面向对象设计之外也存在许多其他模式。
为什么要学习设计模式?
事实是,您可能会在不了解任何设计模式的情况下从事多年的程序员工作。 很多人就是这样做的。 但是,即使在这种情况下,您也可能在不知情的情况下实现了一些模式。 那么你为什么要花时间学习它们呢?
设计模式是针对软件设计中常见问题的久经考验的解决方案的工具包。 即使您从未遇到过这些问题,了解模式仍然很有用,因为它教会您如何使用面向对象设计的原则解决各种问题。
设计模式定义了一种通用语言,团队成员可以使用它来更有效地进行交流。 你可以说,“哦,就用单例模式吧”,每个人都会理解你的建议背后的想法。 如果您知道模式及其名称,则无需解释单例是什么。
设计模式的分类
设计模式的不同之处在于它们的复杂性、详细程度和对正在设计的整个系统的适用性。 我喜欢道路建设的类比:你可以通过安装一些交通信号灯或建造一个完整的多层立交桥,并为行人提供地下通道,从而使十字路口更安全。
最基本和低级的模式通常称为习语。 它们通常只适用于一种编程语言。
最通用和最高级的模式是架构模式。 开发人员几乎可以用任何语言来实现这些模式。 与其他模式不同,它们可用于设计整个应用程序的架构。
此外,所有模式都可以按其意图或目的进行分类。 涵盖了三组主要模式:
创建模式提供了对象创建机制,可以提高现有代码的灵活性和重用性。
结构模式解释了如何将对象和类组装成更大的结构,同时保持结构的灵活性和效率。
行为模式负责有效的沟通和对象之间的责任分配。
创建模式
- 简单工厂模式 (Simple Factory)
- 工厂方法模式 (Factory Method)
- 抽象工厂模式 (Abstract Factory)
- 创建者模式(Buidler)
- 原型模式 (Prototype)
- 单例模式 (Singleton)
结构模式
- 适配器模式 (Adapter)
- 桥接模式(Bridge)
- 组合模式(Composite)
- 装饰模式(Decorator)
- 外观模式(Facade)
- 享元模式(Flyweight)
- 代理模式(Proxy)
行为模式
- 职责链模式(Chain of Responsibility)
- 命令模式(Command)
- 迭代器模式(Iterator)
- 中介者模式(Mediator)
- 备忘录模式(Memento)
- 观察者模式(Observer)
- 状态模式(State)
- 策略模式(Strategy)
- 模板方法模式(Template Method)
- 访问者模式(Visitor)
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!