DTO나 data model entity의 경우 data layer에서 사용되고 domain layer에서는 data layer로의 참조를 없애기 위해 따로 model이 필요하다. 이 때 데이터를 매핑 해주는 mapper가 필요하다. 또한 mock data를 만들 경우에도 mapper를 사용할 수 있다.
양방향 mapper는 아래와 같이 구현할 수 있다.
//convert an object
fun <IN, OUT> Mapper<IN, OUT>.to(input: IN?): OUT? {
return if (input != null) this.to(input) else null
}
fun <IN, OUT> Mapper<IN, OUT>.from(out: OUT?): IN? {
return if (out != null) this.from(out) else null
}
// convert list of objects
fun <IN, OUT> Mapper<IN, OUT>.to(list: List<IN>): List<OUT> {
return list.map { this.to(it) }
}
fun <IN, OUT> Mapper<IN, OUT>.from(list: List<OUT>): List<IN> {
return list.map { this.from(it) }
}
https://medium.com/@zorbeytorunoglu/event-patterns-in-android-kotlin-bcfdd254e44b
이벤트 패턴은 보통 앱 내에서 이벤트나 알림을 처리하고 전파하는 데 사용되는 패턴이다. 여러 layer 등 다양한 구성 요소 간 통신에 사용된다.
Subject - observer, LiveData나 RxJava 등에 사용된다.
Interface나 callback을 통해 다른 컴포넌트에 이벤트를 트리거 한다. onClickListener 등 UI와 사용자의 상호 작용을 처리하는데 사용된다.
Observer pattern의 확장으로 publisher가 이벤트나 메시지를 publish 하면 subscriber가 이벤트를 수신한다. EventBus 등에서 사용된다.
요청을 캡슐화하여 queue, request, operation을 통해 클라이언트를 매개변수화 한다. ViewModel에서 UI 관련 작업을 캡슐화 한다.
함수를 인자로 전달하여 호출 된 함수가 콜백을 호출할 수 있도록 한다. 비동기 프로그래밍에 널리 사용된다.