Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

dearbeany

[Java] Template Method Pattern | Strategy Pattern 본문

Spring

[Java] Template Method Pattern | Strategy Pattern

dearbeany 2022. 10. 11. 14:04

변수나 함수 단위의 공통부분 → 부모클래스에서 변수나 함수를 선언함으로써 묶는다

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에서 나온다(객체생성)

 

 

 

전략패턴의 양상은 스프링프레임워크의 역할과 비슷하다.

스프링 컨테이너 : 객체관리 컨테이너

스프링 프레임워크가 나오기 직전에는 팩토리메소드 패턴을 이용해 객체를 생성하는 담당클래스를 만들어서 관리하였다.