学习资源

学习笔记

If all you have is a hammer, everything looks like a nail.
如果你只有一把锤子,那么一切看起来都像钉子。

这是我看到的对于学习设计模式利弊的最好评语

学习设计模式的好处在于给于我们启示,以一种更加系统结构化的眼光看待问题,并在某种程度上有利于规避潜在问题的出现,但在另一反面一味的套用设计模式也僵化我们的思维,导致遇到什么问题都想机械的套用模板,哪怕是特别简单的问题,这反而会不利于项目的实现。

什么是设计模式

Design patterns are solutions to recurring problems; guidelines on how to tackle certain problems. They are not classes, packages or libraries that you can plug into your application and wait for the magic to happen. These are, rather, guidelines on how to tackle certain problems in certain situations.

设计模式是反复出现的问题的解决方案;关于如何解决某些问题的指南。它们不是可以插入应用程序并等待奇迹发生的类、包或库。相反,这些是关于如何在某些情况下解决某些问题的指导方针。

Design patterns are solutions to recurring problems; guidelines on how to tackle certain problems

设计模式是反复出现的问题的解决方案;关于如何解决某些问题的指南

Design patterns are typical solutions to commonly occurring problems in software design. They are like pre-made blueprints that you can customize to solve a recurring design problem in your code.

设计模式是软件设计中常见问题的典型解决方案。它们就像预制的蓝图,您可以对其进行自定义以解决代码中反复出现的设计问题。

与算法的区别

Patterns are often confused with algorithms, because both concepts describe typical solutions to some known problems. While an algorithm always defines a clear set of actions that can achieve some goal, a pattern is a more high-level description of a solution. The code of the same pattern applied to two different programs may be different.

模式经常与算法混淆,因为这两个概念都描述了一些已知问题的典型解决方案。虽然算法总是定义一组可以实现某些目标的明确操作,但模式是对解决方案的更高级描述。应用于两个不同程序的相同模式的代码可能不同。

An analogy to an algorithm is a cooking recipe: both have clear steps to achieve a goal. On the other hand, a pattern is more like a blueprint: you can see what the result and its features are, but the exact order of implementation is up to you.

算法的类比是烹饪食谱:两者都有明确的步骤来实现目标。另一方面,模式更像是蓝图:你可以看到结果和它的功能是什么,但确切的实现顺序取决于你。

设计模式的主要元素

  • Intent of the pattern briefly describes both the problem and the solution.

    模式的意图简要描述了问题和解决方案。

  • Motivation further explains the problem and the solution the pattern makes possible.

    动机进一步解释了问题和模式使解决方案成为可能。

  • Structure of classes shows each part of the pattern and how they are related.

    类的结构显示了模式的每个部分以及它们之间的关系。

  • Code example in one of the popular programming languages makes it easier to grasp the idea behind the pattern.

    一种流行的编程语言的代码示例可以更轻松地掌握模式背后的思想。

设计模式的六大原则

1、开闭原则(Open Close Principle)

开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

2、里氏代换原则(Liskov Substitution Principle)

里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

3、依赖倒转原则(Dependence Inversion Principle)

这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。

5、迪米特法则,又称最少知道原则(Demeter Principle)

最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则(Composite Reuse Principle)

合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

history of patterns

设计模式的发明很难确定于某一具体的人,通常是在代码实践过程对于某类项目一次又一次的反复出现的解决方法,人们最终将其记录命名记录下来。

Who invented patterns? That’s a good, but not a very accurate, question. Design patterns aren’t obscure, sophisticated concepts—quite the opposite. Patterns are typical solutions to common problems in object-oriented design. When a solution gets repeated over and over in various projects, someone eventually puts a name to it and describes the solution in detail. That’s basically how a pattern gets discovered.

谁发明了图案?这是一个很好的问题,但不是一个非常准确的问题。设计模式并不是晦涩难懂的复杂概念,恰恰相反。模式是面向对象设计中常见问题的典型解决方案。当一个解决方案在各种项目中一遍又一遍地重复时,最终会有人给它起一个名字并详细描述该解决方案。这基本上就是模式被发现的方式。

The concept of patterns was first described by Christopher Alexander in A Pattern Language: Towns, Buildings, Construction. The book describes a “language” for designing the urban environment. The units of this language are patterns. They may describe how high windows should be, how many levels a building should have, how large green areas in a neighborhood are supposed to be, and so on.

模式的概念最早是由克里斯托弗·亚历山大(Christopher Alexander)在《模式语言:城镇、建筑物、建筑》一书中描述的。该书描述了一种设计城市环境的“语言”。这种语言的单位是模式。他们可能会描述窗户应该有多高,建筑物应该有多少层,社区中的绿地应该有多大,等等。

The idea was picked up by four authors: Erich Gamma, John Vlissides, Ralph Johnson, and Richard Helm. In 1994, they published Design Patterns: Elements of Reusable Object-Oriented Software, in which they applied the concept of design patterns to programming. The book featured 23 patterns solving various problems of object-oriented design and became a best-seller very quickly. Due to its lengthy name, people started to call it “the book by the gang of four” which was soon shortened to simply “the GoF book”.

这个想法被四位作者采纳:Erich Gamma、John Vlissides、Ralph Johnson 和 Richard Helm。1994 年,他们出版了《设计模式:可重用面向对象软件的元素》,其中他们将设计模式的概念应用于编程。这本书收录了 23 种模式,解决了面向对象设计的各种问题,并很快成为畅销书。由于它的名字很长,人们开始称它为“四人帮的书”,很快就被简称为“GoF书”。

Since then, dozens of other object-oriented patterns have been discovered. The “pattern approach” became very popular in other programming fields, so lots of other patterns now exist outside of object-oriented design as well.

从那时起,又发现了数十种其他面向对象的模式。“模式方法”在其他编程领域变得非常流行,因此现在在面向对象设计之外也存在许多其他模式。

分类

  • Creational patterns provide object creation mechanisms that increase flexibility and reuse of existing code.

    创建模式提供了对象创建机制,这些机制可提高现有代码的灵活性和重用性。

  • Structural patterns explain how to assemble objects and classes into larger structures, while keeping these structures flexible and efficient.

    结构模式解释了如何将对象和类组装成更大的结构,同时保持这些结构的灵活性和效率。

  • Behavioral patterns take care of effective communication and the assignment of responsibilities between objects.

    行为模式负责对象之间的有效沟通和责任分配。

序号 模式 & 描述 包括
1 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,
而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
2 结构型模式 这些模式关注对象之间的组合和关系,
旨在解决如何构建灵活且可复用的类和对象结构。
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
过滤器模式(Filter、Criteria Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
3 行为型模式 这些模式关注对象之间的通信和交互,
旨在解决对象之间的责任分配和算法的封装。
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
空对象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)
4 J2EE 模式 这些设计模式特别关注表示层。
这些模式是由 Sun Java Center 鉴定的。
MVC 模式(MVC Pattern)
业务代表模式(Business Delegate Pattern)
组合实体模式(Composite Entity Pattern)数据访问对象模式(Data Access Object Pattern)
前端控制器模式(Front Controller Pattern)
拦截过滤器模式(Intercepting Filter Pattern)
服务定位器模式(Service Locator Pattern)
传输对象模式(Transfer Object Pattern)