Результат показать преподавателю.

Лабораторная работа № 26

Создание программной системы, использующей шаблон MVP .

Теория:

MVP — это паттерн программирования графических интерфейсов. В нём приложение делится на три компонента:

· Model (Модель) работает с данными, проводит вычисления и руководит всеми бизнес-процессами.

· View (Вид или представление) показывает пользователю интерфейс и данные из модели.

· Presenter (Представитель) служит прослойкой между моделью и видом.

Как и другие подобные паттерны (MVC, MVVM), MVP позволяет ускорить разработку и разделить ответственность разных специалистов; приложение удобнее тестировать и поддерживать.

Чаще всего его используют разработчики мобильных приложений, однако он гораздо популярнее, чем может показаться. Дело в том, что этот паттерн активно применяется в вебе, хотя там его и называют MVC:

Сравнение паттерна MVP и MVC в вебе

Как работает MVP

На схеме выше видно, что приложение, созданное по принципам MVP, работает с помощью связи модели, вида и представителя. Происходит это так:

1. Вид строит интерфейс и добавляет в него данные из модели.

2. Пользователь видит информацию и взаимодействует с интерфейсом.

3. Вид перехватывает события и передаёт (делегирует) их представителю.

4. Представитель обрабатывает данные (не всегда) и передаёт их модели.

5. Модель выполняет какие-то операции и обновляется (меняет те или иные свойства).

6. Представитель получает обновлённую модель и передаёт её виду.

7. Вид строит интерфейс с новыми данными.

Основное отличие MVP и MVC в том, что в MVC обновлённая модель сама говорит виду, что нужно показать другие данные. Если же этого не происходит и приложению нужен посредник в виде представителя, то паттерн стоит называть MVP.

Всё это можно сравнить с работой издательства:

1. Автор готовит текст (модель).

2. Текст получает издатель (представитель).

3. Если с текстом всё в порядке, издатель передаёт его в отдел вёрстки (вид).

4. Верстальщики готовят книгу, которую начинают продавать читателям (пользователи).

5. Если пользователи как-то реагируют на книгу, например, пишут письма в издательство, то работа может начаться заново. Допустим, кто-то может заметить в книге неточность, тогда издатель передаст информацию автору, автор её обновит и так далее.

Конечно, это не точный алгоритм работы издательства, но для иллюстрации принципов MVP его достаточно.

 

Задание:

Так как MVP служит для упрощения разработки графических интерфейсов, рассмотреть его можно на примере WPF-приложения. В качестве вида будут выступать файлы MainWindow.xaml (разметка интерфейса) и MainWindow.xaml.cs (обработчик событий).

Начать можно с создания интерфейса авторизации:

<Border HorizontalAlignment="Center" VerticalAlignment="Center" Width="250">

       <StackPanel>

                   <TextBlock Text="Login form" TextAlignment="Center"/>

                   <DockPanel LastChildFill="True">

                               <TextBlock Text="Login:"/>

                               <TextBox Name="LoginTextBox"/>

                   </DockPanel>

                   <DockPanel LastChildFill="True">

                               <TextBlock Text="Password:"/>

                               <PasswordBox Name="PassBox"/>

                   </DockPanel>

                   <Button Content="Log in" Name="LoginButton" Click="LoginButton_Click" IsDefault="True"/>

                   <TextBlock Name="MessageBlock"/>

       </StackPanel>

</Border>

 

Вот что должно получиться:

На изображении к интерфейсу применены стили

Теперь можно приступить к файлу MainWindow.xaml.cs:

public partial class MainWindow : Window{       //Создание связи с другими компонентами       private Model model;        private Presenter presenter;        public MainWindow() // Инициализация компонентов       {                   InitializeComponent();                    model = new Model();                    presenter = new Presenter(model);       }        private void LoginButton_Click(object sender, RoutedEventArgs e) //Обработчик события нажатия на кнопку входа       {                   this.model = this.presenter.Login(LoginTextBox.Text, PassBox.Password); //Отправка данных представителю и получение обновлённой модели                   Update(); //Вызов метода обновления интерфейса       }        private void Update()       {                   MessageBlock.Text = this.model.Message; //Вывод сообщения из модели       }}

 

Тут уже заложена необходимая связь между компонентами. Дальше стоит рассмотреть код представителя:

public class Presenter{       private Model model; //Связь с моделью        public Presenter(Model model)       {                   this.model = model;       }        public Model Login(string login, string password) //Получение данных от вида       {                   login = login.Trim(); //Обработка полученной информации                   password = password.Trim();                    this.model.Login(login, password); //Обновление модели                    return this.model; //Передача обновлённой модели       }}

 

Он получает данные, обрабатывает их и передаёт модели. Модель обновляется, а представитель возвращает её виду.

Вот что происходит в модели:

public class Model{       private List<User> users;       private User loggedUser;        public Model()       {                   users = new List<User>(); //Создание списка тестовых пользователей                    users.Add(new User("Name1","Login1","password1"));                   users.Add(new User("Name2", "Login2", "password2"));                   users.Add(new User("Name3", "Login3", "password3"));                   users.Add(new User("Name4", "Login4", "password4"));                    loggedUser = null;       }        public void Login(string login, string password) //Метод авторизации       {                   bool hasLogged = false;                    foreach (User user in this.users)                    {                                if (user.Login == login && user.Password == password) //Поиск совпадений полученных данных с пользовательскими                                {                                            this.loggedUser = user; //Обновление модели                                            hasLogged = true;                                            break;                                }                   }                    if (!hasLogged)                   {                                this.loggedUser = null;                   }       }        public string Message       {                   get                   {                                return this.loggedUser != null ? $"Nice to see you {this.loggedUser.Name}!" : "Wrong login or password!"; //Вывод сообщения в зависимости от того, успешно ли был авторизован пользователь                   }       }}

 

Тут появляется новая сущность — User. Этот и подобные классы используются в качестве данных, с которыми работает модель. Таких классов может быть сколько угодно: работа с ними ведётся так же, как и вне паттерна MVP. Вот и сам класс User:

public class User       {                   private string name;                   private string login;                   private string password;                    public User(string name, string login, string password)                   {                                this.name = name;                                this.login = login;                                this.password = password;                   }                    public string Name                   {                                get                                {                                            return this.name;                                }                   }                    public string Login                   {                                get                                {                                            return this.login;                                }                   }                    public string Password                   {                                get                                {                                            return this.password;                                }                   }       }

 

Теперь можно проверить, как это всё работает:

 

Результат показать преподавателю.

 

 


Дата добавления: 2021-12-10; просмотров: 22; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!