Skip to content

Instantly share code, notes, and snippets.

@kouzouigh
Forked from lievendoclo/presenter.kt
Created April 11, 2021 13:46
Show Gist options
  • Save kouzouigh/cf580def0f2a1595329f9108d7c45783 to your computer and use it in GitHub Desktop.
Save kouzouigh/cf580def0f2a1595329f9108d7c45783 to your computer and use it in GitHub Desktop.
Presenter in Clean Architecture
// shared datastructures
data class ResponseModel(val value: String)
data class JsonResponse(val jsonValue: String)
// example 1
interface FooUseCase {
fun <T> T doSomething(presenter: (ResponseModel -> T))
}
@RestController
@RequestMapping("/bar")
class Controller(val useCase: FooUseCase) {
@GetMapping
fun bar() : JsonResponse {
return useCase.doSomething { responseModel -> JsonResponse(responseModel.value) }
}
}
// example 2
interface FooUseCase {
fun doSomething(presenter: Consumer<ResponseModel>)
}
class JsonPresenter() : Consumer<ResponseModel> {
private var presented : JsonResponse
fun accept(responseModel responseModel) {
presented = JsonResponse(responseModel.value)
}
fun getPresentedState() = presented
}
@RestController
@RequestMapping("/bar")
class Controller(val useCase: FooUseCase) {
@GetMapping
fun bar() : JsonResponse {
val presenter = JsonPresenter()
useCase.doSomething(presenter)
return presenter.getPresentedState();
}
}
// example 3
interface FooUseCase {
fun doSomething(presenter: Consumer<ResponseModel>)
}
class JsonPresenter(val httpResponse: HttpServletResponse) : Consumer<ResponseModel> {
fun accept(responseModel: ResponseModel) {
httpResponse.getWriter().println(ObjectMapper().writeAsString(responseModel))
}
}
@RestController
@RequestMapping("/bar")
class Controller(val useCase: FooUseCase) {
@GetMapping
fun bar(val httpResponse: HttpResponse) {
val presenter = JsonPresenter(httpResponse)
useCase.doSomething(presenter)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment