← Назад к вопросам

Для чего нужен Presenter в MVP?

2.0 Middle🔥 121 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Presenter в архитектуре MVP

Presenter — это промежуточный слой между View и Model, который отвечает за всю бизнес-логику и обработку данных. Это сердце MVP архитектуры.

Основные задачи Presenter

  1. Обработка пользовательских действий — когда пользователь нажимает кнопку на View, обработку выполняет именно Presenter, а не Activity/Fragment
  2. Получение данных из Model — Presenter запрашивает данные из бизнес-слоя (Repository, Service, API)
  3. Преобразование данных — приведение данных в формат, который удобно отображать на экране
  4. Управление состоянием — отслеживание текущего состояния экрана (loading, success, error)
  5. Связь между View и Model — реализует оба интерфейса (View Interface и Model Callbacks)

Пример реализации

// Interface, который View должна имплементировать
interface UserView {
    fun showLoading()
    fun hideLoading()
    fun showUsers(users: List<User>)
    fun showError(message: String)
}

// Presenter
class UserPresenter(private val view: UserView, private val userRepository: UserRepository) {
    
    fun loadUsers() {
        view.showLoading()
        
        userRepository.getUsers(object : Callback<List<User>> {
            override fun onSuccess(users: List<User>) {
                view.hideLoading()
                view.showUsers(users)
            }
            
            override fun onError(error: Throwable) {
                view.hideLoading()
                view.showError(error.message ?: "Unknown error")
            }
        })
    }
    
    fun onUserClicked(user: User) {
        // Обработка клика
    }
}

// View (Activity)
class UserActivity : AppCompatActivity(), UserView {
    private lateinit var presenter: UserPresenter
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_user)
        
        // Dependency Injection
        presenter = UserPresenter(this, UserRepository())
        presenter.loadUsers()
    }
    
    override fun showLoading() {
        progressBar.visibility = View.VISIBLE
    }
    
    override fun hideLoading() {
        progressBar.visibility = View.GONE
    }
    
    override fun showUsers(users: List<User>) {
        userAdapter.setData(users)
    }
    
    override fun showError(message: String) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
    }
}

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

Разделение ответственности — View не знает о бизнес-логике, только отображает то, что ей говорит Presenter

Тестируемость — Presenter легко тестировать, так как он не зависит от Android Framework (можно писать unit-тесты)

Переиспользование — один Presenter может работать с разными реализациями View

Чистый код — Activity/Fragment становятся тонкой оболочкой, занимаются только UI

Когда используется Presenter

  • Экраны с достаточной логикой (списки, фильтры, поиск)
  • Команда разработчиков (нужна структура)
  • Проекты, требующие хорошей тестовой базы

Альтернативы

В современных проектах часто используют MVVM (с LiveData/StateFlow) или MVI, которые упрощают реактивность, но Presenter остаётся классической и надёжной архитектурой для Android.