From 511f0084fa60ab5e63950f4ccb154bfc8dc86e52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Fri, 7 Mar 2025 20:01:26 +0200 Subject: [PATCH] docs: add mvvm architecture diagram --- model-view-viewmodel/README.md | 5 +++++ .../etc/mvvm-architecture-diagram.png | Bin 0 -> 24802 bytes 2 files changed, 5 insertions(+) create mode 100644 model-view-viewmodel/etc/mvvm-architecture-diagram.png diff --git a/model-view-viewmodel/README.md b/model-view-viewmodel/README.md index 335b4222a..46597bedd 100644 --- a/model-view-viewmodel/README.md +++ b/model-view-viewmodel/README.md @@ -42,6 +42,11 @@ Wikipedia says > Model–view–viewmodel (MVVM) is a software architectural pattern that facilitates the separation of the development of the graphical user interface (the view) – be it via a markup language or GUI code – from the development of the business logic or back-end logic (the model) so that the view is not dependent on any specific model platform. +Architecture diagram + +![Model-View-ViewModel Architecture Diagram](./etc/mvvm-architecture-diagram.png) + + ## Programmatic Example of Model-View-ViewModel Pattern in Java ViewModel will hold the business logic and expose the data from model to View. diff --git a/model-view-viewmodel/etc/mvvm-architecture-diagram.png b/model-view-viewmodel/etc/mvvm-architecture-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..279c734cdbff0d668dd9de81b1ca0aebb5c420f8 GIT binary patch literal 24802 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 Nl~aCP`pD4lKL8T!pbr25 literal 0 HcmV?d00001