위임 패턴이란 객체 구성을 통해 상속과 동일한 코드 재사용 목적을 이뤄낼 수 있도록 해주는 디자인 패턴이다.
클래스가 구현해야할 내용을 다른 객체를 통해 목적을 이뤄내고 본인의 역할에만 집중할 수 있기 때문에 단일 책임 원칙을 지킬 수 있게된다.
덕분에 코드간의 결합도가 줄어들어 유지보수에 도움을 줄 수 있다.
축구팀의 감독은 본인이 모든 훈련을 직접 지도하지 않는다. 피지컬 전문 훈련 코치에게 위임한다.
코드는 간단하다. 다른 객체를 구성해서 메소드 호출 시 다른 객체에게 전달하는 형태를 합쳐 위임이 된다.
Manager
클래스는 피지컬 트레이닝에 대한 코드를 구현하지 않고 다른 Trainer
객체에게 과정을 위임한다.
class Manager(val physicalTrainer: Trainer) {
fun train() {
physicalTrainer.train()
// 그외 다른 훈련들...
}
}
interface Trainer {
fun train()
}
객체간의 관계를 설명할 때 is-a
관계와 has-a
관계를 많이 얘기한다.
특정 클래스를 상속받는 관계를 is-a
관계,
특정 객체를 가지고 있는 형태의 관계를 has-a
관계로 볼 수 있다.
상속이 필요하지 않고 다른 객체를 통해 목적을 이뤄낼 수 있다면 위임 패턴을 사용하는 것이 코드 결합도를 낮출 수 있다.
즉 is-a
관계를 가질 필요가 없다면 위임을 사용한다.
위임을 잘 사용한다면 객체를 쉽게 교체할 수 있어 코드가 전반적으로 유연해지며 동일한 기능을 사용해야하는 다수의 클래스에서 한번의 구현가지고 사용할 수 있어 재사용성이 증가하여 코드를 줄일 수 있게 된다.
또한 각 기능을 담당하는 객체를 나누어 각각의 역할에만 집중하면 되기 때문에 앞서 말한대로 단일책임 원칙을 지킬 수 있게된다.
하지만 위임의 관계가 복잡해지면 코드를 파악하기 어려울 수 있으므로 주의해야한다.