Motivation: We need to use an existing class whose interface is incompatible with what our code expects, and we cannot (or do not want to) modify that class (e.g., because it lives in a third-party library).

Intent: Convert the interface of a class into another interface that clients expect.

This seems to be middleware between a provider and the client. When the provider changes, only the adapter needs changing.

interface MediaPlayer {
    fun play(filename: String)
}
 
class VlcPlayer {
    fun playVlc(filename: String) { /* ... */ }
}
 
class VlcAdapter(private val vlcPlayer: VlcPlayer) : MediaPlayer {
    override fun play(filename: String) = vlcPlayer.playVlc(filename)
}