1. 인터페이스란?
- 키보드나 디스플레이 따위처럼 사람과 컴퓨터를 연결하는 장치
- 기능에 대한 선언과 구현을 분리해주는 기능 역할
- 기능을 사용하는데 있어서 통로 역할
2. 델리게이트(Delegate)란?
- 사전적 의미에서는 어떤 사람이나 그룹을 대신하는 사람, 즉 대리인 혹은 대표로 해석
- 특정 기능의 동작을 다른 객체에게 위임하여 동작하도록 함
public class AService {
//has a 관계
BRepository bRepository;
public void save() {
// save 동작을 bRepository에게 위임하여 처리
bRepository.save();
}
}
3. 전략(Strategy) 패턴
- 여러 알고리즘을 하나의 추상적인 접근점(인터페이스)을 만들어 접근점에서 서로 교환 가능하도록 하는 패턴
- 사용자가 하나의 접근점을 통해서 필요한 전략에따라 구현된 다양한 알고리즘을 선택하여 사용하도록 하는 패턴
전략패턴 구현
- 신작 게임에서 캐릭터와 무기를 구현
- 무기는 두가지 종류(칼, 검)이 존재
// 추상 접근점 UML 다이어그램중 Strategy에 해당
public interface Weapon {
public void attack();
}
// 선택 가능한 전략 UML 중 ConcreteStrategyA
public class Knife implements Weapon {
@Override
public void attack() {
System.out.println("칼 공격");
}
}
// 선택 가능한 전략 ConcreteStrategyB
public class Sword implements Weapon {
@Override
public void attack() {
System.out.println("검 공격");
}
}
// UML 다이어그램중 Context에 해당
public class Character {
// 접근점
private Weapon weapon;
// 전략 교환 가능
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
public void attack() {
if(weapon == null) {
System.out.println("맨손 공격");
} else {
// 델리게이트
weapon.attack();
}
}
}
실제 사용
public class Main {
public static void main(String[] args) {
Character character = new Character();
character.attack();
character.setWeapon(new Knife());
character.attack();
character.setWeapon(new Sword());
character.attack();
}
}
장점
- 알고리즘을 정의하고 캡슐화한후 런타임 시점에 선택 사용이 가능
- 전략에 해당하는 알고리즘의 추가 삭제에 유연하게 대처 가능
- 각각의 전략에 해당하는 알고리즘을 독립적으로 테스트할 수 있음
단점
- 추가적인 클래스, 인터페이스가 필요함으로 코드 복잡성이 증가될 수 있음
- 해당 패턴에서 사용될 전략들에 대해 추가적인 이해가 필요함
4. 전략패턴의 적용
- 하나의 객체에서 다양한 알고리즘을 사용하고 싶으며, 런타임 중에 알고리즘(전략)을 유연하게 바꿔 사용하고 싶을때 사용
- 특정 인터페이스의 구현체가 다양하며, 해당 구현체를 상황에따라 바꿔 사용해야 할 필요가 있을때
번외. 디자인 패턴의 사용 이유
디자인 패턴은 문제 해결방법에 대한 Best Practice이다.
기존 수많은 개발자들이 앞서 겪은 문제들을 해결한 방법들을 살펴보니 모두 공통된 방식을 사용하고 있었고.
이런 수많은 Software 문제를 해결한 패턴을 분석하여 발견한 공통된 패턴을 모아둔것이 Design Pattern이다.
디자인 패턴을 사용함으로 우리는 [재사용성을 높이고, 변경에 유연하게 대처] 할 수 있으며, 복잡한 설명 없이 [간단한 커뮤니케이션]으로 구조화된 패턴을 설명할 수 있다. 더불어 검증되고 테스트된 디자인 패턴 구조의 사용으로 [설계 과정의 생산성 향상]을 도모할 수 있다.
'Software Engineering' 카테고리의 다른 글
[디자인패턴] 팩토리 메서드(Factory Method) 패턴 (0) | 2024.04.16 |
---|---|
[디자인 패턴] 빌더(Builder) 패턴 (0) | 2024.04.15 |
[디자인패턴] 어댑터(Adapter) 패턴 (0) | 2024.04.12 |