본문 바로가기

IT/헤드퍼스트 디자인패턴

[디자인패턴] Delegation Pattern

안녕하세요 남갯입니다

오늘은 Delegation Pattern에 대해 개인적으로 정리해보려고합니다.

잘못된 부분을 바로 알려주시면 감사하겠습니다.




--사진 출처--

http://best-practice-software-engineering.ifs.tuwien.ac.at/patterns/delegation.html




Delegation Pattern

보통 Delegaiton Pattern을 상속을 대체할때 사용하라고 말합니다. 보통 상속을 경우는 부모클래스와 자식클래스와 밀접한 관계가 있을때 사용하게 되는데, 비슷한 상속을 받는 경우가 있을때 Delegation Pattern은 되게 유연하게 관계를 만들어 줄 수 있습니다.



1. 여러 클래스에서 겹치는 매소드를 줄이기는것이 필요하기 위해 사용합니다.

(Kotlin 소스)

** 실제 코틀린에서는 실제 클래스위임을 언어수준에서 지원하는 기능힙니다. 따라서 위임패턴을 손 쉽게 구현할수있습니다.


interface Vehicle {
fun drive(): String
}

class CarImpl(val where: String) : Vehicle {
override fun drive() = "is going to $where"
}

class AirplaneImpl(val where: String) : Vehicle {
override fun drive() = "is flying to $where"
}

class CarOrAirplace(val model: String, impl: Vehicle) : Vehicle by impl {
fun tellMeYourTrip() {
println("$model ${drive()}")
}
}

fun main(args: Array<String>) {
val myAirbus330 = CarOrAirplace("Lamborghini", CarImpl("Seoul"))
val myBoeing337 = CarOrAirplace("boeing 33u7", AirplaneImpl("Seoul"))


myAirbus330.tellMeYourTrip()
myBoeing337.tellMeYourTrip()
}

소스코드의 출처: 

https://medium.com/til-kotlin-ko/kotlin%EC%9D%98-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%9C%84%EC%9E%84%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94%EA%B0%80-c14dcbbb08ad

(직접 다 입력한거임)



2. 하나의 독립적인 행동이 필요하지만, 미래에 이 행동이 바뀔 수 있는상황에서 사용합니다.

(Java 소스)

interface MoveBehavior {
public void makeBehavior();
}

public class RunBehavior implements MoveBehavior {
@Override
public void makeBehavior() {
System.out.println("make a run");
}
}

public class FlyBehavior implements MoveBehavior {
@Override
public void makeBehavior() {
System.out.println("make a fly");
}
}

public class Duck {
private MoveBehavior moveBehavior = new RunBehavior();

public void makeBehavior() {
this.moveBehavior.makeBehavior();
}

public void setMoveBehavior(MoveBehavior moveBehavior) {
this.moveBehavior = moveBehavior;
}
}

public void main() {
Duck duck = new Duck();
duck.makeBehavior();
MoveBehavior newBehavior = new FlyBehavior();
duck.setMoveBehavior(newBehavior);
duck.makeBehavior();
}


3. 하나의 상속된 형태를 위임과 함께 사용하기 위해 사용합니다.

(Java 소스)

interface hello {
void methodHello();

void methodBye();
}

class ABC implements hello {
String name = "";

ABC(String name) {
this.name = name;
}

@Override
public void methodHello() {
System.out.println("say hello ");
}

@Override
public void methodBye() {
System.out.println("say bye");
}
}

class XYZ implements hello {
ABC abc;

XYZ(String name) {
abc = new ABC(name);
}

@Override
public void methodHello() {
abc.methodHello();
}

@Override
public void methodBye() {
abc.methodBye();
}
}