dearbeany
[Java] Template Method Pattern | Strategy Pattern 본문
변수나 함수 단위의 공통부분 → 부모클래스에서 변수나 함수를 선언함으로써 묶는다
ex) Person클래스 - String name, doSomething()
함수의 내용물이 서로 다른 것 → 부모클래스에서 abstract 한 메소드를 선언함으로써 구조는 공통으로 하되, 내용을 다르게 구성한다
ex) Person클래스를 상속받은 Student, Employee 클래스
단, 각 클래스마다 doSomething()의 내용 구현이 다르다
Student : 입실-공부-급식-퇴실
Employee : 입실-일-웰스토리-퇴실
But 만약 함수 내부에서도 공통된 부분은? → 템플릿 메소드 패턴을 사용하자
*템플릿메소드 : 어떤 하나의 템플릿 메소드 안에서 추상메소드를 호출하고, 이 추상메소드의 구체적인 동작을 자식 클래스에서 결정할 수 있도록 열어논 것
즉, 코드 단위의 공통구조를 묶어내는 하나의 방법. 추상메소드를 이용하여 특정 명령 파트만 잘라내서 부모로 묶어낼 수 있음
(cf. 상속 - 변수, 함수단위를 부모로 묶어내는 것)
ex) doSomething() 하기 전에 전후 작업을 포함하는 메소드를 만들자. daily()
public abstract class Person {
private String name;
public abstract void doSomething();
public void daily() {
System.out.println("입실체크한다.");
doSomething();
System.out.println("퇴실체크한다.");
}
}
함수의 동작순서 : doSomething() 호출 시, 동적바인딩에 의해 자식클래스가 구현한 함수로 실행된다.
템플릿 메소드 패턴의 한계
하지만, 템플릿 메소드는 자식 클래스 간의 중복되어있는 기능을 묶어낼 수 없다.
Student : 입실-공부-급식-퇴실
Employee : 입실-일-웰스토리-퇴실
SSAFY : 입실-공부-웰스토리-퇴실
이러한 경우 각 세 클래스에서 구현하는 doSomething의 내용물들이 2번씩이나 구현해야 한다.
public class Student extends Person{
@Override
public void doSomething() {
System.out.println("공부한다.");
System.out.println("급식을 먹는다.");
}
}
public class Employee extends Person{
@Override
public void doSomething() {
System.out.println("일을 한다.");
System.out.println("웰스토리를 먹는다.");
}
}
public class SSAFY extends Person{
@Override
public void doSomething() {
System.out.println("공부한다.");
System.out.println("웰스토리를 먹는다.");
}
}
템플릿 메소드 패턴의 경우 공부한다 -> 의 내용을 바꾸려면 일일히 해야하나,
전략패턴은 doStudy에 구현된 공부한다를 바꾸면 한꺼번에 유지보수가 편리해짐
전략패턴
위의 템플릿메소드의 문제점을 전략패턴을 이용하여 해결하려고 한다.
이어서, 우리는 공부-웰스토리를 각각 1번만 구현하고 싶다.
그렇다면? 공부-일-급식-웰스토리를 모두 각각의 클래스로 쪼개버리자.
중복된 구현을 없앨 수 있는 방법은 기능 별로 쪼개서 만들고 조립해야 한다.
위처럼 중복되는 기능들은 각각의 4개의 클래스로 쪼갠 후에, 다른 3개의 클래스가 필요할 때마다 참조해서 쓰는 방식으로 구현해보자.
전략패턴 : 여러 기능들을 전략 단위로 만들어두고, 필요에 따라 전략을 조합하여 사용하는 방법
전략 클래스 - DoStudy, DoWork, EatCafeteria, EatWellStory
이 전략들을 동적으로 바꿔서 선택할 수 있는 것이 전략패턴
전략패턴의 중요한 것은 느슨한 결합, 의존관계의 역전
의존은 new에서 나온다(객체생성)
전략패턴의 양상은 스프링프레임워크의 역할과 비슷하다.
스프링 컨테이너 : 객체관리 컨테이너
스프링 프레임워크가 나오기 직전에는 팩토리메소드 패턴을 이용해 객체를 생성하는 담당클래스를 만들어서 관리하였다.
'Spring' 카테고리의 다른 글
[MyBatis] MyBatis와 Java 초기세팅 (Mapper, typeAlias, $과 #의 차이) (0) | 2022.10.20 |
---|---|
[Spring] SpringMVC 요청처리흐름 | 파일업로드와 다운로드 실습 (0) | 2022.10.19 |
[AOP] 프록시패턴 (0) | 2022.10.13 |
[Spring] Spring DI 종합실습1~3. JDBC 를 Spring 프로젝트로 바꾸기 | AOP (0) | 2022.10.12 |
[Spring] 의존성주입(DI)와 제어역행(IoC) (0) | 2022.10.11 |