Вақте ки ман саёҳати худро ҳамчун як таҳиягари Android оғоз кардам, калимаҳои "Архитектураи замимаҳои мобилӣ" маро ба ҳайрат оварданд, Google ва мақолаҳо дар бораи Ҳабре маро ба депрессияи боз ҳам бештар бурд - ман ба китоб нигоҳ мекунам ва ҳеҷ чизро намебинам. Ман фикр мекунам, ки агар шумо ин мақоларо хонда истода бошед, шумо аллакай ин расмро на як маротиба омӯхтаед ва кӯшиш кардаед, ки чӣ рӯй дода истодааст: Мушкилоти дарки равиши меъморӣ дар рушди мобилӣ, ба назари ман, дар абстрактии худи меъморӣ аст. Ҳар як таҳиягар диди худро дар бораи чӣ гуна дуруст татбиқ кардани ин ё он намуна дорад. Намунаҳои бештар ё камтар аз татбиқи MVP дар бахши англисзабони Интернет пайдо шуданд, ки ин тааҷҷубовар нест. Биёед мухтасар дида бароем, ки чӣ аст ва ба мисол мегузарем. Модели - сатҳи маълумот. Ман истифодаи истилоҳи "мантиқи тиҷорат"-ро дӯст намедорам, аз ин рӯ дар замимаҳои худ ман онро репозиторий меномам ва он бо пойгоҳи додаҳо ва шабака муошират мекунад. Намоиш — сатҳи намоиш. Он Фаъолият , Фрагмент ё Намоиши фармоишӣ хоҳад буд , агар ба шумо рақс бо танбур ва муошират бо давраи ҳаёт маъқул набошад. Ёдовар мешавам, ки дар аввал ҳама замимаҳои Android ба сохтори MVC тобеъанд , ки дар он контроллер фаъолият ё фрагмент аст . Баранда қабати байни Намоиш ва Модел аст. Намоиш воқеаҳоеро, ки бо он рух медиҳанд, интиқол медиҳад, баранда онҳоро коркард мекунад, агар лозим бошад, ба Модел дастрасӣ пайдо мекунад ва маълумотро ба Намоиш барои намоиш бармегардонад. Дар робита ба Android ва як мисоли мушаххас, ман қисми муҳимро қайд мекунам - Шартнома. Ин интерфейсест, ки тамоми муносибатҳои байни ҷузъҳои дар боло зикршударо тавсиф мекунад. Барои ҷамъбасти қисми назариявӣ:
- View дар бораи Presenter медонад;
- Баранда дар бораи Намоиш ва Модел (Репозиторий) медонад;
- Модели худ;
- Шартнома муносибатҳои байни онҳоро танзим мекунад.
MainContract
:
public interface MainContract {
interface View {
void showText();
}
interface Presenter {
void onButtonWasClicked();
void onDestroy();
}
interface Repository {
String loadMessage();
}
}
Ҳоло, мо танҳо 3 ҷузъи барномаи ояндаи худро таъкид карда истодаем ва онҳо чӣ кор хоҳанд кард. Минбаъд мо анборро тавсиф мекунем:
public class MainRepository implements MainContract.Repository {
private static final String TAG = "MainRepository";
@Override
public String loadMessage() {
Log.d(TAG, "loadMessage()");
/** Здесь обращаемся к БД or сети.
* Я специально ничего не пишу, чтобы не загромождать пример
* DBHelper'ами и прочими не относяшимеся к теме an objectми.
* Поэтому я буду возвращать строку Сосисочная =)
*/
return "Сосисочная у Лёхи»;
}
}
Бо он ҳама чиз равшан аст, танҳо бор кардан ва борфарорӣ кардани маълумот. Оянда баранда аст:
public class MainPresenter implements MainContract.Presenter {
private static final String TAG = "MainPresenter";
//Компоненты MVP applications
private MainContract.View mView;
private MainContract.Repository mRepository;
//Сообщение
private String message;
//Обрати внимание на аргументы конструктора - мы передаем экземпляр View, а Repository просто создаём конструктором.
public MainPresenter(MainContract.View mView) {
this.mView = mView;
this.mRepository = new MainRepository();
Log.d(TAG, "Constructor");
}
//View сообщает, что кнопка была нажата
@Override
public void onButtonWasClicked() {
message = mRepository.loadMessage();
mView.showText(message);
Log.d(TAG, "onButtonWasClicked()");
}
@Override
public void onDestroy() {
/**
* Если бы мы работали например с RxJava, в этом классе стоило бы отписываться от подписок
* Кроме того, при работе с другими методами асинхронного андроида,здесь мы боремся с утечкой контекста
*/
Log.d(TAG, "onDestroy()");
}
}
Дар хотир доред, ки ман дар бораи рақс бо танбур ва давраи ҳаёт навишта будам? Баранда то он даме, ки Намоиши он зинда аст, ҳангоми таҳияи сенарияҳои мураккаби корбар, ман ба шумо маслиҳат медиҳам, ки ҳама зангҳои бозбинии Намоишро дар Presenter такрор кунед ва дар лаҳзаҳои мувофиқ ба онҳо занг занед, то давраи ҳаёти Фаъолият/Фрагментро такрор кунед, то сари вақт дарк кунед, ки чӣ лозим аст. бо маълумоте, ки дар айни замон дар «интерлятор» овезон аст, анҷом дода шавад. Ва ниҳоят, Намоиш:
public class MainActivity extends AppCompatActivity implements MainContract.View {
private static final String TAG = "MainActivity";
private MainContract.Presenter mPresenter;
private Button mButton;
private TextView myTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Создаём Presenter и в аргументе передаём ему this - эта Activity расширяет интерфейс MainContract.View
mPresenter = new MainPresenter(this);
myTv = (TextView) findViewById(R.id.text_view);
mButton = (Button) findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.onButtonWasClicked();
}
});
Log.d(TAG, "onCreate()");
}
@Override
public void showText(String message) {
myTv.setText(message);
Log.d(TAG, "showMessage()");
}
//Вызываем у Presenter метод onDestroy, чтобы избежать утечек контекста и прочих неприятностей.
@Override
public void onDestroy() {
super.onDestroy();
mPresenter.onDestroy();
Log.d(TAG, "onDestroy()");
}
}
Чӣ гап шудааст?
- Фаъолият, ки бо номи Намоиш низ маълум аст,
onCreate()
дар усул як мисоли Presenter эҷод мекунад ва худро ба созандаи он мегузарад. - Вақте ки презентатсия сохта мешавад, он ба таври возеҳ Намоишро қабул мекунад ва як мисоли анбориро эҷод мекунад (дар омади гап, онро Singleton кардан мумкин аст)
- Вақте ки тугма пахш карда мешавад, Намоиш барандаро мекӯбад ва мегӯяд: "Тугма пахш карда шуд".
- Баранда ба репозиторий рӯй медиҳад: "Ин аҳмақро барои ман зеркашӣ кунед."
- Репозиторий "мавод" -ро ба баранда бор мекунад ва мерасонад.
- Баранда ба Намоиш рӯй медиҳад: "Инак маълумот барои шумост, онро кашед"
GO TO FULL VERSION