https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4#
인프런 강의 내용 요약 + 참고
용어
스트래티지 패턴이란? : 여러 알고리즘을 하나의 추상적인 접근점을 만들어 접근점에서 서로 교환 가능하도록 하는 패턴을 의미한다.
델리게이트란? : 위임하다는 뜻으로서 특정 기능을 사용하기 위해 다른 객체의 기능을 호출한다는 뜻이다.
좀 더 풀어서 천천히 생각해보자
내가 정의한 알고리즘(메소드)이 여러 개가 있다고 가정한다.
어플리케이션에서 달라지는 부분(공통적인 부분)을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다. (예를 들면 Animal이라는 클래스와 그것을 상속받는 Eagle 클래스와 Tiger클래스가 있다. 여기서 move()는 공통 메서드이고 fly()는 Eagle클래스에만 해당하는 메소드이다. )
달라지는 부분은 따로 뽑아서 캡슐화(인터페이스 화) 시킨다. ( fly()메소드를 따로 빼서 인터페이스화 시킨다)
그렇게 하면 바뀌지 않는 부분에는 영향을 미치지 않는다는 것이다. 최종적으로 달라지는 부분을 인터페이스에 위임하면 된다(델리게이트)
한 줄로 요약하자면,
스트래티지 패턴을 사용해서, 변하는 부분을 캡슐화하고 해당 기능을 인터페이스에 위임함으로써 코드의 중복 없이 재사용이 가능 해진다.
코드 예제
Weapon.java (인터페이스)
public interface Weapon {
public void attack();
}
Sword.java (구현 1)
public class Sword implements Weapon{
@Override
public void attack() {
System.out.println("검 공격");
}
}
Knife.java (구현 2)
public class Knife implements Weapon{
@Override
public void attack() {
System.out.println("칼 공격");
}
}
GameCharacter.java (델리게이트)
public class GameCharacter {
// 접근점
private Weapon weapon;
//교환 가능
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
public void attack() {
if (weapon == null) {
System.out.println("맨손공격");
} else {
// 델리게이트 - 어떻게 공격하는지는 모른다
weapon.attack();
}
}
}
Main.java
public class Main {
public static void main(String[] args) {
GameCharacter character = new GameCharacter();
character.attack();
character.setWeapon(new Knife());
character.attack();
character.setWeapon(new Sword());
character.attack();
}
}
유지 보수 사항이 생기더라도(새로운 클래스가 추가되더라도) 코드를 새로 작성할 필요 없이 변하는 부분 변하지 않는 부분만 판단해서 추가 작성한 후 위임하면 된다.
소스코드
https://github.com/garam-park/java-designpattern
참고
https://hyeonstorage.tistory.com/146
'Java > design pattern' 카테고리의 다른 글
[java] 6강 프로토 타입 패턴(Prototype Pattern) (2) | 2020.01.22 |
---|---|
[java] 5강 싱글톤 패턴(singleton pattern) (0) | 2020.01.22 |
[java] 4강 팩토리 메소드 패턴(Factory Pattern) (0) | 2020.01.22 |
[java] 3강 템플릿 메소드 패턴(Template Method Pattern) (0) | 2020.01.13 |
[java] 2강 어댑터 패턴(adapter pattern) (0) | 2020.01.13 |