하나의 인터페이스를 다른 인터페이스로 전환해준다.
어떤 클래스가 + 모양이고 클라이언트는 별모양의 인터페이스만 받을 수 있다면 Adapter패턴을 이용해 +모양 클래스를 별모양 클래스로 바꾸어준다.
Adapter는 바꿀 클래스를 감싸는 느낌이나서 wrapper라 불리기도한다.
protocol Animal {
func walk()
}
class Cat: Animal {
func walk() {
print("Cat walking")
}
}
class Dog: Animal {
func walk() {
print("Dog walking")
}
}
class Fish {
func swim() {
print("Fish swimming")
}
}
class FishAdapter: Animal {
private let fish: Fish
init(fish: Fish) {
self.fish = fish
}
func walk() {
self.fish.swim()
}
}
func makeWalk(animal: Animal) {
animal.walk()
}
let kitty = Cat()
let bingo = Dog()
let nemo = Fish()
makeWalk(animal: kitty)
makeWalk(animal: bingo)
// 'makeWalk(nemo)'는 불가능합니다. nemo는 'Animal' 프로토콜을 따르지 않기 때문입니다.
let adaptedNemo = FishAdapter(fish: nemo)
makeWalk(animal: adaptedNemo)