From d36eeec52c691c616d79db85513350004fb03b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Wed, 5 Mar 2025 21:47:22 +0200 Subject: [PATCH] docs: add mvi architecture diagram --- model-view-intent/README.md | 5 +++++ .../etc/mvi-architecture-diagram.png | Bin 0 -> 27947 bytes 2 files changed, 5 insertions(+) create mode 100644 model-view-intent/etc/mvi-architecture-diagram.png diff --git a/model-view-intent/README.md b/model-view-intent/README.md index 659bf1b95..1febe76b0 100644 --- a/model-view-intent/README.md +++ b/model-view-intent/README.md @@ -37,6 +37,11 @@ In plain words > The Model-View-Intent (MVI) pattern is a reactive architectural approach where user actions (Intent) modify the application state (Model), and the updated state is then reflected back in the user interface (View) in a unidirectional and cyclical data flow. +Architecture diagram + +![Model-View-Intent Architecture Diagram](./etc/mvi-architecture-diagram.png) + + ## Programmatic Example of Model-View-Intent Pattern in Java The Model-View-Intent (MVI) pattern for Java is a modern approach to structuring your application's logic, ensuring a smooth, unidirectional flow of data and events. It's a variation of the Model-View-Presenter (MVP) and Model-View-ViewModel (MVVM) patterns, but with a more streamlined flow of data and events. diff --git a/model-view-intent/etc/mvi-architecture-diagram.png b/model-view-intent/etc/mvi-architecture-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..a0672ddc051f0c493e64028878ff594eafaf682e GIT binary patch literal 27947 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