学习资源👇
- [菜鸟](设计模式简介 | 菜鸟教程 (runoob.com))
- [维基百科](软件设计模式 - 维基百科,自由的百科全书 — Software design pattern - Wikipedia)
- ⭐[Refactoring.Guru](常用设计模式有哪些? (refactoringguru.cn))
- [github](kamranahmedse/design-patterns-for-humans: An ultra-simplified explanation to design patterns (github.com))
学习笔记📕
If all you have is a hammer, everything looks like a nail.
如果你只有一把锤子,那么一切看起来都像钉子。
这是我看到的对于学习设计模式利弊的极佳评语
学习设计模式的好处在于给于我们启示,以一种更加系统结构化的眼光看待问题,并在某种程度上有利于规避潜在问题的出现,但在另一反面一味的套用设计模式也僵化我们的思维,导致遇到什么问题都想机械的套用模板,哪怕是特别简单的问题,这反而会不利于项目的实现。
什么是设计模式✨
设计模式是对于反复出现的问题的解决方案,是关于如何解决某些问题的指南。它们不是可以插入应用程序中的类、包或库。相反,这些是关于如何在某些情况下解决某些问题的指导方针,是一种思想方面的东西。
设计模式是软件设计中常见问题的典型解决方案。它们就像预制的蓝图,你可以对其进行自定义以解决代码中反复出现的设计问题。
与算法的区别
设计模式经常与算法混淆,因为这两个概念都描述了一些已知问题的典型解决方案。算法是定义一组可以实现某些目标的明确操作,而模式是对解决方案的更高层次的描述。应用于两个不同程序的相同模式的代码可能不同。
算法可以类比为烹饪食谱:有明确的步骤来实现目标。而模式更像是蓝图:你可以看到结果和它的功能是什么,但确切的实现顺序取决于你。
设计模式的主要元素
-
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)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。
设计模式的历史👣
设计模式的发明很难确定于某一具体的人,通常是在代码实践过程对于某类项目一次又一次的反复出现的解决方法,人们最终将其记录命名记录下来。
模式的概念最早是由克里斯托弗·亚历山大(Christopher Alexander)在《模式语言:城镇、建筑物、建筑》一书中描述的。该书描述了一种设计城市环境的“语言”。这种语言的单位是模式。他们可能会描述窗户应该有多高,建筑物应该有多少层,社区中的绿地应该有多大,等等。
这个想法被四位作者采纳:Erich Gamma、John Vlissides、Ralph Johnson 和 Richard Helm。1994 年,他们出版了《设计模式:可重用面向对象软件的元素》,其中他们将设计模式的概念应用于编程。这本书收录了 23 种模式,解决了面向对象设计的各种问题,并很快成为畅销书。由于它的名字很长,人们开始称它为“四人帮的书”,很快就被简称为“GoF书”。
从那时起,又发现了数十种其他面向对象的模式。“模式方法”在其他编程领域变得非常流行,因此现在在面向对象设计之外也存在许多其他模式。
设计模式的分类
-
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) |
我将在接下的章节中慢慢介绍具体的设计模式😘