[안드로이드] 디자인 패턴(Design Pattern) 이란?
이전 Design Pattern 개념 정리에 이어서
구조(Structural) 에 해당하는 어댑터 패턴(Adapter Pattern) 에 대해 정리하려고 합니다.
1. 어댑터 패턴 (Adapter Pattern)
어댑터 패턴(Adapter Pattern)은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다. (위키 피디아)
기존에 사용하고 있는 라이브러리가 있는데 변경 사항이 생길 때 마다 라이브러리를 수정한다면 해당 라이브러리의 재 활용성이 현저히 떨어질 것입니다. 더군다나 공용으로 쓰고 있는 라이브러리라면 문제가 생길 수도 있습니다.
어댑터 패턴 사용에 가장 큰 이유는 여기에 있습니다. 최대한 기존 코드를 유지하면서, 인터페이스를 활용하여 재활용을 가능하게 만들어 줄 것입니다. 단, Adapter Pattern 을 사용하기 위해 클래스가 많아지면서 복잡할 수 있고 상속을 사용하기 때문에 유연성이 떨어진다는 단점이 있습니다. (무조건 좋은 건 아니네요..)
2. 어댑터 패턴 (Adapter Pattern) 다이어그램
어댑터 패턴의 다이어그램을 통해 구성 요소를 살펴보겠습니다.
① Target : 인터페이스
② Client : Target 인터페이스를 요구하는 요소를 지닌 클래스
③ Adaptee : Client 의 Target 인터페이스를 요구하는 요소에 집어넣고 싶은 클래스
④ Adapter : Adaptee 클래스를 Target 인터페이스에 맞춰 주는 클래스
3. 어댑터 패턴 (Adapter Pattern) : RecyclerView
아래 코드는 RecyclerView.Adapter 를 상속받은 RecyclerAdapter 입니다.
getItemCount() 메서드를 주목해 보자면, RecyclerAdapter 클래스는 RecyclerView.Adapter 의 인터페이스 형태를 통해 getItemCount 메서드의 책임을 위임 받은 것을 확인 할 수 있습니다.
abstract class RecyclerAdapter(private val items: ArrayList<Item>) :
RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder>() {
var mContext: Context? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewHolder {
val v: View = LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false)
mContext = parent.context
return RecyclerViewHolder(v)
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
}
override fun getItemCount(): Int = items.size
class RecyclerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var id: TextView = itemView.findViewById(R.id.id)
}
}
RecyclerView 의 경우는 아래와 같이 정리 할 수 있습니다.
① Target : RecyclerView.Adapter
② Client : recyclerView
③ Adaptee : item
④ Adapter : recyclerAdapter
[참고자료]
https://kscory.com/dev/design-pattern/adapter
0 comments: