From fbde0090a0f68cb3a58c32ed2d68a9e8bf29a4b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 11 Mar 2025 21:42:12 +0200 Subject: [PATCH] docs: add presentation model architecture diagram --- presentation-model/README.md | 5 +++++ .../presentation-model-architecture-diagram.png | Bin 0 -> 27743 bytes 2 files changed, 5 insertions(+) create mode 100644 presentation-model/etc/presentation-model-architecture-diagram.png diff --git a/presentation-model/README.md b/presentation-model/README.md index 597c45803..9b0eb6659 100644 --- a/presentation-model/README.md +++ b/presentation-model/README.md @@ -29,6 +29,11 @@ In plain words > The Presentation Model design pattern separates the UI logic from the business logic by creating an intermediate model that represents the data and behavior of the UI independently, enhancing testability, maintainability, and flexibility. +Architecture diagram + +![Presentation Model Architecture Diagram](./etc/presentation-model-architecture-diagram.png) + + ## Programmatic Example of Presentation Model Pattern in Java The Presentation Model design pattern is a pattern that separates the responsibility of managing the state and behavior of the GUI in a separate model class. This model class is not tied to the view and can be used to test the GUI behavior independently of the GUI itself. diff --git a/presentation-model/etc/presentation-model-architecture-diagram.png b/presentation-model/etc/presentation-model-architecture-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..8c6718dfb89b379f1217555dfa58bc098145b2ee GIT binary patch literal 27743 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 C{*=A| literal 0 HcmV?d00001