From 794795acf5ed09485a072ee12104c4e7972de19c Mon Sep 17 00:00:00 2001 From: jinishavora <40777762+jinishavora@users.noreply.github.com> Date: Mon, 22 Mar 2021 02:13:34 -0400 Subject: [PATCH] task: MVVM design pattern using zkoss framework. (#1678) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * MVVM design pattern using zkoss framework. * MVVM Design pattern updates for issues reported by SonarCloud. * MVVM Design pattern updates for coverage issues reported by SonarCloud. * MVVM Design pattern updates for coverage issues (removing lombok @Data) reported by SonarCloud. * MVVM Design pattern updates for coverage issues reported by Sonar - TEST cases added for Equals and ToString * MVVM Design Pattern - updating missing/todo details. * MVVM Design Pattern - adding lombok.config * MVVM Design Pattern - Removing xml, updating pom.xml and README as per suggested changes in code review * Update model-view-viewmodel/README.md * Update model-view-viewmodel/README.md * Update model-view-viewmodel/README.md * Update model-view-viewmodel/README.md * MVVM Design Pattern - Updated pom.xml and Readme based on Suggested changes * added type as xml * MVVM Design Patterm - root pom.xml and module pom.xml updated * Update pom.xml Co-authored-by: Subhrodip Mohanta Co-authored-by: Ilkka Seppälä --- model-view-viewmodel/README.md | 145 ++++++++++++++++++ .../etc/model-view-viewmodel.png | Bin 0 -> 40539 bytes .../etc/model-view-viewmodel.urm.puml | 43 ++++++ model-view-viewmodel/lombok.config | 2 + model-view-viewmodel/pom.xml | 115 ++++++++++++++ .../src/main/assembly/webapp.xml | 25 +++ .../iluwatar/model/view/viewmodel/Book.java | 37 +++++ .../model/view/viewmodel/BookService.java | 10 ++ .../model/view/viewmodel/BookServiceImpl.java | 38 +++++ .../model/view/viewmodel/BookViewModel.java | 43 ++++++ .../src/main/webapp/META-INF/MANIFEST.MF | 8 + .../src/main/webapp/WEB-INF/web.xml | 114 ++++++++++++++ .../src/main/webapp/index.zul | 34 ++++ .../model/view/viewmodel/BookTest.java | 108 +++++++++++++ pom.xml | 10 +- 15 files changed, 730 insertions(+), 2 deletions(-) create mode 100644 model-view-viewmodel/README.md create mode 100644 model-view-viewmodel/etc/model-view-viewmodel.png create mode 100644 model-view-viewmodel/etc/model-view-viewmodel.urm.puml create mode 100644 model-view-viewmodel/lombok.config create mode 100644 model-view-viewmodel/pom.xml create mode 100644 model-view-viewmodel/src/main/assembly/webapp.xml create mode 100644 model-view-viewmodel/src/main/java/com/iluwatar/model/view/viewmodel/Book.java create mode 100644 model-view-viewmodel/src/main/java/com/iluwatar/model/view/viewmodel/BookService.java create mode 100644 model-view-viewmodel/src/main/java/com/iluwatar/model/view/viewmodel/BookServiceImpl.java create mode 100644 model-view-viewmodel/src/main/java/com/iluwatar/model/view/viewmodel/BookViewModel.java create mode 100644 model-view-viewmodel/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 model-view-viewmodel/src/main/webapp/WEB-INF/web.xml create mode 100644 model-view-viewmodel/src/main/webapp/index.zul create mode 100644 model-view-viewmodel/src/test/java/com/iluwatar/model/view/viewmodel/BookTest.java diff --git a/model-view-viewmodel/README.md b/model-view-viewmodel/README.md new file mode 100644 index 000000000..6df1ea5d7 --- /dev/null +++ b/model-view-viewmodel/README.md @@ -0,0 +1,145 @@ +--- +layout: pattern +title: Model-View-ViewModel +folder: model-view-viewmodel +permalink: /patterns/model-view-viewmodel/ +categories: Architectural +tags: + - Decoupling +--- + +## Also known as + +Model–View–Binder + +## Intent + +To apply "[Separation of Concerns](https://java-design-patterns.com/principles/#separation-of-concerns)" to separate the logic from the UI components and allow developers to work on UI without affecting the logic and vice versa. + +## Explanation + +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. + +**Programmatic Example** + +Zkoss implementation: + +> ViewModel will hold the business logic and expose the data from model to View + +```java +public class BookViewModel { + @WireVariable + private List bookList; + private Book selectedBook; + private BookService bookService = new BookServiceImpl(); + + public Book getSelectedBook() { + return selectedBook; + } + + @NotifyChange("selectedBook") + public void setSelectedBook(Book selectedBook) { + this.selectedBook = selectedBook; + } + + public List getBookList() { + return bookService.load(); + } + + /** Deleting a book. + */ + @Command + @NotifyChange({"selectedBook","bookList"}) + public void deleteBook() { + if (selectedBook != null) { + getBookList().remove(selectedBook); + selectedBook = null; + } +} +``` + +> View will have no logic, only UI elements + +```xml + + + + + + + + + + + + +