Skip to content
/ design-patterns Public template

Design Pattern 经典设计模式源码 C/Java/Go/JavaScript/Python等不同语言实现。 FP/OOP/MVC/MVP/MVVM/DDD等设计思想研究

License

Notifications You must be signed in to change notification settings

microwind/design-patterns

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

设计模式Design Patterns与编程范式Programming Paradigms English

  • 经典设计模式与编程范式等详解,结合实际场景,充分注释说明。
  • 不同语言实现语言,包括C Java JavaScript Python Go等,体现不同语言特性。
  • 不断补充和完善,打造设计模式与编程思想的资源库。

设计模式结构图 Design-patterns structure

设计模式源码 Design-patterns source

创建型 (Creational Patterns)

设计模式 说明 C源码 Java源码 JS源码 Python源码 TypeScript源码 Go源码
工厂模式(Factory Pattern) 由工厂类提供统一的创建对象的方法。 C Java JavaScript Python TypeScript Go
抽象工厂模式(Abstract Factory Pattern) 是一个超级工厂,用来创建其他工厂方法。 C Java JavaScript Python TypeScript Go
原型模式(Prototype Pattern) 利用clone()复制已有对象的实例。 C Java JavaScript Python TypeScript Go
建造者模式(Builder Pattern) 利用多个简单对象逐步构建一个复杂对象,类似建造房子。 C Java JavaScript Python TypeScript Go
单例模式(Singleton Pattern) 保证创建的类只有一个实例,并提供一个访问该实例的全局节点。 C Java JavaScript Python TypeScript Go

结构型 (Structural Patterns)

设计模式 说明 C源码 Java源码 JS源码 Python源码 TypeScript源码 Go源码
适配器模式(Adapter Pattern) 为两个不兼容的接口提供专门兼容方案。 C Java JavaScript Python TypeScript Go
桥接模式(Bridge Pattern) 将类拆分为抽象和实现两个独立的层次结构进行解耦。 C Java JavaScript Python TypeScript Go
组合模式(Composite Pattern) 依据树形结构来组合对象,用不同组件来构建某个部分或整体对象。 C Java JavaScript Python TypeScript Go
装饰器模式(Decorator Pattern) 将对象放入到一个特殊封装的对象中,赋予其新的能力。 C Java JavaScript Python TypeScript Go
外观模式(Facade Pattern) 给现有的系统添加一个高层接口,隐藏子系统的复杂性。 C Java JavaScript Python TypeScript Go
享元模式(Flyweight Pattern) 通过共享多个对象的相同状态,让有限的内存容量载入更多对象。 C Java JavaScript Python TypeScript Go
代理模式(Proxy Pattern) 用一个类来代理另一个类或几个类的功能。 C Java JavaScript Python TypeScript Go
过滤器模式(Filter Pattern) 使用不同的标准条件来过滤一组对象,并通过逻辑运算的方式把各条件连接起来。 C Java JavaScript Python TypeScript Go

行为型 (Behavioral Patterns)

设计模式 说明 C源码 Java源码 JS源码 Python源码 TypeScript源码 Go源码
策略模式(Strategy Pattern) 将每一个算法策略封装到接口中,根据需要设定策略,使具体实现和策略解耦。 C Java JavaScript Python TypeScript Go
观察者模式(Observer Pattern) 当主题对象的状态发生改变时,所有依赖对象都得到通知并被自动更新。 C Java JavaScript Python TypeScript Go
迭代器模式(Iterator Pattern) 给数据对象构建一套按顺序访问集合对象元素的方式。 C Java JavaScript Python TypeScript Go
模板方法模式(Template Method Pattern) 定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中。 C Java JavaScript Python TypeScript Go
责任链模式(Chain of Responsibility Pattern) 为请求创建了一个接收者对象的链,请求沿着处理者链进行发送和处理。 C Java JavaScript Python TypeScript Go
命令模式(Command Pattern) 把请求以命令的形式包裹在对象中,并传给调用对象。 C Java JavaScript Python TypeScript Go
备忘录模式(Memento Pattern) 将对象的状态捕捉住,并以备忘录的形式存储起来,以便合适的时候还原。 C Java JavaScript Python TypeScript Go
状态模式(State Pattern) 类的行为是基于它的状态改变的,不同的状态下有不同的行为。 C Java JavaScript Python TypeScript Go
访问者模式(Visitor Pattern) 封装访问者类,把各元素类的操作集合起来,目的是将数据结构与数据操作分离。 C Java JavaScript Python TypeScript Go
中介者模式(Mediator Pattern) 它用一个中介对象来封装一系列的动作,以让对象之间进行交流。 C Java JavaScript Python TypeScript Go
解释器模式(Interpreter Pattern) 实现了一个表达式接口,并能解释特定的上下文里面的变量和语句。 C Java JavaScript Python TypeScript Go

设计模式7大原则 Design-principles

原则 描述 示例代码 反例代码
1. 开闭原则 (Open Closed Principle, OCP) 对扩展开放,对修改关闭。即在不修改现有代码的基础上,通过扩展来增加功能。 例子 反例
2. 单一职责原则 (Single Responsibility Principle, SRP) 一个类应该只负责一个职责,尽量避免多重职责。 例子 反例
3. 依赖倒置原则 (Dependency Inversion Principle, DIP) 高层模块不应依赖低层模块,二者应依赖于抽象。具体实现应依赖于抽象接口,而非直接依赖具体类。 例子 反例
4. 接口隔离原则 (Interface Segregation Principle, ISP) 一个类对另一个类的依赖应建立在最小的接口上,避免不必要的接口依赖。强调高内聚低耦合。 例子 反例
5. 组合/聚合复用原则 (Composite/Aggregate Reuse Principle, CARP) 在代码复用时,应优先考虑使用组合而非继承。大多数情况下,组合比继承更灵活。 例子 反例
6. 迪米特法则 (Law of Demeter, LoD) 一个实体应尽量减少对其他实体的了解,降低系统模块间的耦合性。 例子 反例
7. 里氏代换原则 (Liskov Substitution Principle, LSP) 子类可以替代父类出现,而不会影响程序的正确性。子类可以覆盖父类的抽象方法,但不能覆盖父类的非抽象方法。 例子 反例

编程范式 Programming Paradigm

编程范式 描述 应用场景
面向过程编程 (Procedural Programming, PP) 强调按步骤执行程序,关注程序流程和每个操作步骤,通常通过函数或过程来实现。 适用于小型项目或功能明确的任务,常见于脚本编程或系统工具开发。
面向对象编程 (Object-Oriented Programming, OOP) 通过类和对象来组织程序,强调封装、继承、组合和多态性,关注“谁来做”而非“怎么做”。 适用于大型复杂项目,特别是需要良好的模块化和可扩展性时。
封装 (Encapsulation) 将数据和操作数据的函数包装在一起,控制外部访问方式,保障数据安全。 用于保证数据的完整性和安全性,通常在复杂对象建模时使用。
继承 (Inheritance) 通过父类与子类关系,子类继承父类的属性和方法,从而实现代码复用。 用于需要构建共享代码和功能层次结构的应用,如继承多个不同类型的动物类。
组合 (Composition) 使用对象之间的组合关系而不是继承来重用功能。 适用于灵活的模块化设计,尤其当继承关系过于复杂时,组合可以提供更高的灵活性。
多态 (Polymorphism) 允许使用相同的接口调用不同的对象,实现方法的动态绑定。 常用于处理多种类型对象的统一接口,特别是在事件处理和策略模式中。
函数式编程 (Functional Programming, FP) 通过纯函数和不可变数据来描述程序,强调“做什么”,而非“怎么做”。 适用于需要高并发、高可维护性的场景,常见于数据处理和流处理系统。
面向切面编程 (Aspect-Oriented Programming, AOP) 通过预编译和动态插入,在不修改核心业务代码的情况下,将代码挂载到指定位置。 适用于解耦关注点(如日志、事务管理等)的场景,通常用于企业级应用。
事件驱动编程 (Event-Driven Programming, EDP) 程序的执行流程由事件驱动,通过监听和响应事件来触发操作。 常见于GUI开发、服务器端开发和实时应用程序(如WebSocket、UI响应等)。
响应式编程 (Reactive Programming, RP) 以数据流和变化传播为核心,通过异步数据流实现响应式操作,自动响应数据变化。 用于处理实时数据流、UI更新和异步操作,常见于实时监控系统和流式数据处理应用。

设计思想与分层架构设计

设计思想 描述 应用场景 示例代码
MVC (Model-View-Controller) MVC是一种常见的设计模式,旨在将应用程序分为三个部分:模型(Model)处理数据、视图(View)展示用户界面、控制器(Controller)处理用户输入并更新模型和视图。 适用于需要分离表示层和业务逻辑的应用,例如Web开发、桌面应用等。通过分离关注点,提高系统的可维护性和可扩展性。 演示例子
MVP (Model-View-Presenter) MVP模式是MVC的变种,其中控制器(Controller)被替换为展示者(Presenter)。Presenter负责将数据从模型传递给视图,视图只负责显示内容,不直接与模型交互。 适用于需要更精细控制视图展示和与用户交互的应用,特别是当视图需要大量更新或变化时。 演示例子
MVVM (Model-View-ViewModel) MVVM是一种设计模式,它将视图与视图的状态和业务逻辑分开。通过引入视图模型(ViewModel),将视图的显示逻辑与业务逻辑分离,ViewModel负责为视图提供数据并响应用户操作。 适用于需要响应式数据绑定的应用,例如现代的前端开发框架(如Angular、Vue.js)和桌面应用程序(如WPF)。 演示例子
DDD (Domain-Driven Design) 领域驱动设计是一种软件设计方法,旨在通过将业务逻辑与实现细节分离,提高代码的可维护性和可扩展性。DDD将系统划分为多个层次,每个层次都有明确的职责和边界。 适用于复杂业务逻辑和高度演化的业务需求,适用于大型企业级应用,如金融系统、供应链管理、医疗管理等。 演示例子

设计模式、分层架构、编程范式区别

特性/概念 目的 实现方式 适用场景 示例
设计模式 提供解决特定问题的最佳设计实践,让代码组织合理有序。 通过模板、类或接口定义具体实现 当面临常见的设计问题时 单例模式、工厂模式、观察者模式
分层架构 将应用程序划分为多个独立但相互协作的层次或模块,每一层负责不同的功能。 使用不同层次或模块来构建系统 在构建大型、复杂的系统时 MVC、MVP、MVVM、DDD
编程范式 定义了组织代码的基本方法和结构,反映了程序员思考问题的方式。 根据范式选择合适的编程风格和工具 根据项目需求和个人偏好选择 面向过程、面向对象、函数式

联系 Contact

欢迎共建 Welcome to join