Модель–Представлення–Пред'явник (англ. Model-View-Presenter, MVP) — шаблон проектування, похідний від MVC, що відділяє візуальне відображення та поведінку обробки подій у різні класи, а саме: Представлення (View) та Пред'явник (Presenter).
Передумови для застосування
- Виникає необхідність відділити бізнес-логіку від логіки інтерфейсу користувача, щоб зробити його простішим для розуміння та підтримки.
- Стоїть задача надати доступ до коду різним сторінкам, що потребують однакової поведінки.
- Потрібно максимізувати обсяг коду, що підлягає автоматизованому тестуванню.
Складові частини
Модель
Модель являє собою клас для визначення даних, які будуть відображатися або над якими будуть проводитися інші дії у інтерфейсі користувача.
Представлення
Клас Представлення управляє елементами на сторінці, та направляє події до класу Пред'явника.
Презентер
Пред'явник містить логіку реагування на події, оновлює Модель (бізнес-логіки і даних з програми) і, в свою чергу, маніпулює станом Представлення. Для полегшення тестування Пред'явника, він повинен мати посилання на інтерфейс Представлення замість посилання на конкретну реалізацію. Як наслідок, ви можете легко замінити діюче Представлення на макет для виконання тестів.
Різновиди
Passive View
Представлення майже не містить логіки. Пред'явник — посередник між Представленням та Моделлю. Крім того, у Представлення та Моделі повністю закритий доступ один до одного. Модель може викликати події , але Пред'явник підписується на них для оновлення Представлення.
У "Пасивному Представленні" немає прямої прив'язки даних, натомість, Представлення надає set-властивості , які Пред'явник використовує для надання значень даним. Всі стани керуються Пред'явником, а не Представленням.
Плюси: легкість тестування, прозорий поділ Представлення та Моделі.
Мінуси: витрати часу на самостійну прив'язку даних.
Supervising Controller
У цьому випадку, Пред'явник обробляє події користувача. Представлення зв'язується з Моделлю безпосередньо через прив'язку даних. У цьому випадку, завдання Пред'явника "пройти" від Моделі до Представлення, таким чином, щоб могла відбутися прив'язка даних. Пред'явник буде також містити логіку для таких подій як натискання клавіш, навігації тощо.
Плюси: зменшення обсягу коду, за рахунок використання прив'язки даних.
Мінуси: більш складне тестування, зменшення енкапсуляції у Представленні через прямий зв'язок з Моделлю.
Реалізація
Приклад реалізації шаблону у Windows Forms.
Оголосимо модель, що містить логіку аплікації, не залежну від представлення.
public class OrderDto { public string Name { get; set; } } public interface IOrdersModel { OrderDto[] LoadOrders(); } public class OrdersModel : IOrdersModel { public OrderDto[] LoadOrders() { return new OrderDto[] { new OrderDto(){ Name = "Item1" }, new OrderDto(){ Name = "Item2" }, }; } }
Додамо інтерфейс взаємодії із виглядом та його реалізацію.
// інтерфейс взаємодії не залежить від технологій public interface IOrdersView { void Display(OrderDto[] orders); } // реалізація інтерфейсу взаємодії прив'язана до середовища розгортання public partial class OrdersForm : Form, IOrdersView { private OrdersPresenter presenter; public OrdersForm() { InitializeComponent(); presenter = new OrdersPresenter(this, new OrdersModel()); } // виклик презентера із вигляду private void LoadOrdersButton_Click(object sender, EventArgs e) { presenter.LoadOrders(); } // зміна стану представлення void IOrdersView.Display(OrderDto[] orders) { var orderNames = orders.Select(x => x.Name).ToArray(); this.orderListBox.Items.AddRange(orderNames); } }
Та додамо презентер — компонент, що зв'язує логіку аплікації (модель) із виглядом.
public class OrdersPresenter { private readonly IOrdersView view; private readonly IOrdersModel model; public OrdersPresenter(IOrdersView view, IOrdersModel model) { this.view = view; this.model = model; } // метод-обробник, виконується при взаємодії користувача із виглядом public void LoadOrders() { // керування моделю var orders = model.LoadOrders(); // маніпуляція представленням view.Display(orders); } }
Див. також
Джерела та література
- Martin Fowler. Supervising Controller [ 2 лютого 2014 у Wayback Machine.]
- patterns & practices Web Client Developer Guidance [ 3 лютого 2014 у Wayback Machine.]
- What are MVP and MVC? [ 21 січня 2014 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Model Predstavlennya Pred yavnik angl Model View Presenter MVP shablon proektuvannya pohidnij vid MVC sho viddilyaye vizualne vidobrazhennya ta povedinku obrobki podij u rizni klasi a same Predstavlennya View ta Pred yavnik Presenter Diagrama vzayemodiyi mizh komponentami shablonu MVPPeredumovi dlya zastosuvannyaVinikaye neobhidnist viddiliti biznes logiku vid logiki interfejsu koristuvacha shob zrobiti jogo prostishim dlya rozuminnya ta pidtrimki Stoyit zadacha nadati dostup do kodu riznim storinkam sho potrebuyut odnakovoyi povedinki Potribno maksimizuvati obsyag kodu sho pidlyagaye avtomatizovanomu testuvannyu Skladovi chastiniModel Model yavlyaye soboyu klas dlya viznachennya danih yaki budut vidobrazhatisya abo nad yakimi budut provoditisya inshi diyi u interfejsi koristuvacha Predstavlennya Klas Predstavlennya upravlyaye elementami na storinci ta napravlyaye podiyi do klasu Pred yavnika Prezenter Pred yavnik mistit logiku reaguvannya na podiyi onovlyuye Model biznes logiki i danih z programi i v svoyu chergu manipulyuye stanom Predstavlennya Dlya polegshennya testuvannya Pred yavnika vin povinen mati posilannya na interfejs Predstavlennya zamist posilannya na konkretnu realizaciyu Yak naslidok vi mozhete legko zaminiti diyuche Predstavlennya na maket dlya vikonannya testiv RiznovidiPassive View Passive View Predstavlennya majzhe ne mistit logiki Pred yavnik poserednik mizh Predstavlennyam ta Modellyu Krim togo u Predstavlennya ta Modeli povnistyu zakritij dostup odin do odnogo Model mozhe viklikati podiyi ale Pred yavnik pidpisuyetsya na nih dlya onovlennya Predstavlennya U Pasivnomu Predstavlenni nemaye pryamoyi priv yazki danih natomist Predstavlennya nadaye set vlastivosti yaki Pred yavnik vikoristovuye dlya nadannya znachen danim Vsi stani keruyutsya Pred yavnikom a ne Predstavlennyam Plyusi legkist testuvannya prozorij podil Predstavlennya ta Modeli Minusi vitrati chasu na samostijnu priv yazku danih Supervising Controller Supervising Controller U comu vipadku Pred yavnik obroblyaye podiyi koristuvacha Predstavlennya zv yazuyetsya z Modellyu bezposeredno cherez priv yazku danih U comu vipadku zavdannya Pred yavnika projti vid Modeli do Predstavlennya takim chinom shob mogla vidbutisya priv yazka danih Pred yavnik bude takozh mistiti logiku dlya takih podij yak natiskannya klavish navigaciyi tosho Plyusi zmenshennya obsyagu kodu za rahunok vikoristannya priv yazki danih Minusi bilsh skladne testuvannya zmenshennya enkapsulyaciyi u Predstavlenni cherez pryamij zv yazok z Modellyu RealizaciyaPriklad realizaciyi shablonu u Windows Forms Ogolosimo model sho mistit logiku aplikaciyi ne zalezhnu vid predstavlennya public class OrderDto public string Name get set public interface IOrdersModel OrderDto LoadOrders public class OrdersModel IOrdersModel public OrderDto LoadOrders return new OrderDto new OrderDto Name Item1 new OrderDto Name Item2 Dodamo interfejs vzayemodiyi iz viglyadom ta jogo realizaciyu interfejs vzayemodiyi ne zalezhit vid tehnologij public interface IOrdersView void Display OrderDto orders realizaciya interfejsu vzayemodiyi priv yazana do seredovisha rozgortannya public partial class OrdersForm Form IOrdersView private OrdersPresenter presenter public OrdersForm InitializeComponent presenter new OrdersPresenter this new OrdersModel viklik prezentera iz viglyadu private void LoadOrdersButton Click object sender EventArgs e presenter LoadOrders zmina stanu predstavlennya void IOrdersView Display OrderDto orders var orderNames orders Select x gt x Name ToArray this orderListBox Items AddRange orderNames Ta dodamo prezenter komponent sho zv yazuye logiku aplikaciyi model iz viglyadom public class OrdersPresenter private readonly IOrdersView view private readonly IOrdersModel model public OrdersPresenter IOrdersView view IOrdersModel model this view view this model model metod obrobnik vikonuyetsya pri vzayemodiyi koristuvacha iz viglyadom public void LoadOrders keruvannya modelyu var orders model LoadOrders manipulyaciya predstavlennyam view Display orders Div takozhModel vid kontrolerDzherela ta literaturaMartin Fowler Supervising Controller 2 lyutogo 2014 u Wayback Machine patterns amp practices Web Client Developer Guidance 3 lyutogo 2014 u Wayback Machine What are MVP and MVC 21 sichnya 2014 u Wayback Machine