Sobes.tech
Middle

Разкажете повече за патърна MVP (Model-View-Presenter).

sobes.tech AI

Отговор от AI

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

  • Model: Управлява данните на приложението и бизнес логиката. Не зависи от потребителския интерфейс.
  • View: Показва данните на потребителя и обработва неговия вход. Тя е пасивна и не съдържа логика за вземане на решения.
  • Presenter: Действа като посредник между Model и View. Получава данни от Model и ги форматира за View. Реагира на събития от View и актуализира Model. View се позовава на Presenter, а Presenter на View чрез интерфейс.

Предимства на MVP:

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

Пример:

// Интерфейс на View
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("Грешка при зареждане на данните")
        }
    }
}

// Model
class MainModel {
    fun getData(): String? {
        // Зареждане на данни
        return "Примерни данни"
    }
}

// Активност (Реализация на View)
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
    }
}