The following are simple examples of an implementation of the MVVM pattern.
C++ This is an example using
C++. : export module wikipedia.examples.mvvm.Model; export namespace wikipedia::examples::mvvm { class Model { private: int counter = 0; public:
nodiscard int getCounter() const noexcept { return counter; } void increment() noexcept { counter++; } void decrement() noexcept { counter--; } }; } : export module wikipedia.examples.mvvm.ViewModel; import wikipedia.examples.mvvm.Model; export namespace wikipedia::examples::mvvm { class ViewModel { private: Model& model; public: explicit ViewModel(Model& m): model{m} {} void incrementCounter() noexcept { model.increment(); } void decrementCounter() noexcept { model.decrement(); }
nodiscard int getCounterValue() const noexcept { return model.getCounter(); } }; } : export module wikipedia.examples.mvvm.View; import std; import wikipedia.examples.mvvm.ViewModel; using std::cin; using std::string; export namespace wikipedia::examples::mvvm { class View { private: ViewModel& viewModel; public: explicit View(ViewModel& vm): viewModel{vm} {} void run() { string input; while (true) { std::println("Counter: {}", viewModel.getCounterValue()); std::print("Enter command (i=increment, d=decrement, q=quit): "); std::getline(cin, input); if (input == "i") { viewModel.incrementCounter(); } else if (input == "d") { viewModel.decrementCounter(); } else if (input == "q") { break; } else { std::println("Unknown command."); } } } }; } Then, the application could be run like so: import wikipedia.examples.mvvm.Model; import wikipedia.examples.mvvm.View; import wikipedia.examples.mvvm.ViewModel; using namespace wikipedia::examples::mvvm; int main(int argc, char* argv[]) { Model m; ViewModel vm(m); View v(vm); v.run(); return 0; }
C# This is an example using
C#. : namespace Wikipedia.Examples.Mvvm; public class Model { public int Counter { get; private set; } = 0; public void Increment() => Counter++; public void Decrement() => Counter--; } : namespace Wikipedia.Examples.Mvvm; public class ViewModel { private readonly Model _model; public ViewModel(Model model) { _model = model; } public void IncrementCounter() => _model.Increment(); public void DecrementCounter() => _model.Decrement(); public int CounterValue => _model.Counter; } : namespace Wikipedia.Examples.Mvvm; using System; public class View { private readonly ViewModel _viewModel; public View(ViewModel viewModel) { _viewModel = viewModel; } public void Run() { string input = String.Empty; while (true) { Console.WriteLine($"Counter: {_viewModel.CounterValue}"); Console.Write("Enter command (i=increment, d=decrement, q=quit): "); input = Console.ReadLine(); switch (input) { case "i": _viewModel.IncrementCounter(); break; case "d": _viewModel.DecrementCounter(); break; case "q": return; default: Console.WriteLine("Unknown command."); break; } } } } Then, the application could be run like so: namespace Wikipedia.Examples; using Wikipedia.Examples.Mvvm; public class Main { public static void Main() { Model model = new(); ViewModel viewModel = new(model); View view = new(viewModel); view.Run(); } }
Java This is an example using
Java. : package org.wikipedia.examples.mvvm; public class Model { private int counter = 0; public int getCounter() { return counter; } public void increment() { counter++; } public void decrement() { counter--; } } : package org.wikipedia.examples.mvvm; public class ViewModel { private final Model model; public ViewModel(Model model) { this.model = model; } public void incrementCounter() { model.increment(); } public void decrementCounter() { model.decrement(); } public int getCounterValue() { return model.getCounter(); } } : package org.wikipedia.examples.mvvm; import java.util.Scanner; public class View { private final ViewModel viewModel; public View(ViewModel viewModel) { this.viewModel = viewModel; } public void run() { Scanner stdin = new Scanner(System.in); String input; while (true) { System.out.printf("Counter: %d%n", viewModel.getCounterValue()); System.out.print("Enter command (i=increment, d=decrement, q=quit): "); input = stdin.nextLine(); switch (input) { case "i": viewModel.incrementCounter(); break; case "d": viewModel.decrementCounter(); break; case "q": return; default: System.out.println("Unknown command."); } } } } Then, the application could be run like so: package org.wikipedia.examples; import org.wikipedia.examples.mvvm.*; public class Main { public static void main(String[] args) { Model m = new Model(); ViewModel vm = new ViewModel(m); View v = new View(vm); v.run(); } }
Rust This is an example using
Rust. : pub struct Model { counter: i32, } impl Model { pub fn new() -> Self { Model { counter: 0 } } pub fn get_counter(&self) -> i32 { self.counter } pub fn increment(&mut self) { self.counter += 1; } pub fn decrement(&mut self) { self.counter -= 1; } } : use super::model::Model; pub struct ViewModel { model: &'a mut Model, } impl ViewModel { pub fn new(model: &'a mut Model) -> Self { Self { model } } pub fn increment_counter(&mut self) { self.model.increment(); } pub fn decrement_counter(&mut self) { self.model.decrement(); } pub fn get_counter_value(&self) -> i32 { self.model.get_counter() } } : use std::io::{self, Write}; use super::view_model::ViewModel; pub struct View { view_model: &'a mut ViewModel, } impl View { pub fn new(view_model: &'a mut ViewModel) -> Self { Self { view_model } } pub fn run(&mut self) { loop { println!("Counter: {}", self.view_model.get_counter_value()); print!("Enter command (i=increment, d=decrement, q=quit): "); io::stdout().flush().unwrap(); let mut input: String = String::new(); io::stdin().read_line(&mut input).unwrap(); let input: String = input.trim(); match input { "i" => self.view_model.increment_counter(), "d" => self.view_model.decrement_counter(), "q" => break, _ => println!("Unknown command."), } } } } Then, the application could be run like so: mod mvvm; use mvvm::{ model::Model, view::View, view_model::ViewModel }; fn main() { let mut m: Model = Model::new(); let mut vm: ViewModel = ViewModel::new(&mut m); let mut v: View = View::new(&mut vm); v.run(); } ==See also==