Last active
October 27, 2023 18:21
-
-
Save lievendoclo/89366bd751514498bb74ffa9ca388d26 to your computer and use it in GitHub Desktop.
Presenter in Clean Architecture
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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
Nice!
We are hacking presenting this way...
In usecase class you better return something that can be created by any method of a presenter, just to be sure that all code branches presents something.
Somewhere in the same package as AbstractPresenter, "Presented" marker class have package-private constructor:
So, only AbstractPresenter (and all children of it) can create Presented object and return it to usecase to return it from execute method.