Назад к вопросам
Middle
67
questionbank

Расскажи подробнее о паттерне MVP (Model-View-Presenter).

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

MVP разделяет приложение на три взаимодействующих компонента:

  • Model: Управляет данными приложения, бизнес-логикой. Она не зависит от пользовательского интерфейса.
  • View: Отображает данные пользователю и обрабатывает его ввод. Она пассивна и не содержит логики принятия решений.
  • Presenter: Выступает посредником между Model и View. Получает данные от Model и форматирует их для View. Реагирует на события View и обновляет Model. View ссылается на Presenter, а Presenter ссылается на View через интерфейс.

Преимущества MVP:

  • Устойчивость к изменениям UI: Логика находится в Presenter, который не зависит от конкретной реализации View.
  • Тестируемость: Presenter легко тестировать в изоляции, без необходимости мокать UI.
  • Разделение ответственности: Четкое разделение ролей между компонентами улучшает сопровождаемость кода.

Пример:

// View Interface
interface MainView {
    fun showData(data: String)
    fun showError(message: String)
}

// Presenter
class MainPresenter(private val view: MainView, private val model: MainModel) {

    fun loadData() {
        val data = model.getData()
        if (data != null) {
            view.showData(data)
        } else {
            view.showError("Failed to load data")
        }
    }
}

// Model
class MainModel {
    fun getData(): String? {
        // Загрузка данных
        return "Sample Data"
    }
}

// Activity (View Implementation)
class MainActivity : AppCompatActivity(), MainView {

    private lateinit var presenter: MainPresenter
    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        textView = findViewById(R.id.textView)

        val model = MainModel()
        presenter = MainPresenter(this, model)
        presenter.loadData()
    }

    override fun showData(data: String) {
        textView.text = data
    }

    override fun showError(message: String) {
        textView.text = message
    }
}