반응형
- 알고리즘을 캡슐화해서, 서브클래스에서 언제든 필요할 때마다 가져다가 쓸 수 있도록 하겠습니다.
가정) 공통점을 찾고, 공통점을 캡슐화한다.
카페에서 커피와 홍차를 만드는 법.
커피
1. 물을 끓인다.
2. 끓는 물에 커피를 우려낸다.
3. 커피를 컵에 따른다.
4. 설탕과 우유를 추가한다.
public class Coffee {
void prepare() {
boiledWater();
brewCoffee();
pourInCup();
addSugarAndMilk();
}
public void boiledWater() {
Log.d("abcd","물 끓이기");
}
public void brewCoffee() {
Log.d("abcd","커피를 우려내");
}
public void pourInCup() {
Log.d("abcd","컵에 담");
}
public void addSugarAndMilk(){
Log.d("abcd","설탕과 우유 추가");
}
}
홍차
1. 물을 끓인다.
2. 끓는 물에 차를 우려낸다.
3. 차를 컵에 따른다.
4. 레몬을 추가한다.
public class Tea {
void prepare() {
boiledWater();
brewTea();
pourInCup();
addLemon();
}
public void boiledWater() {
Log.d("abcd","물 끓이기");
}
public void brewTea() {
Log.d("abcd","커피를 우려내");
}
public void pourInCup() {
Log.d("abcd","컵에 담기");
}
public void addLemon(){
Log.d("abcd","레몬 추가");
}
}
추상화하기!
//추상화 클래스(서브클래스에서 상속한다.)
public abstract class makingBeverage {
//만드는 순서를 바꾸지 못하게 final로 지정
final void prepare() {
boiledWater();
brewSomething();
pourInCup();
addSomething();
}
//차와 커피의 공통점
void boiledWater() {
Log.d("abcd","물 끓이기");
}
//차와 커피의 공통점
void pourInCup() {
Log.d("abcd","컵에 따르기");
}
//우려내기
abstract void brewSomething();
//첨가물넣기
abstract void addSomething();
}
//커피
public class Coffee extends makingBeverage {
public void boiledWater() {
Log.d("abcd","물 끓이기");
}
public void pourInCup() {
Log.d("abcd","컵에 담");
}
//서브클래스에서 상속받은 메소드
@Override
void brewSomething() {
Log.d("abcd","커피를 우려내기");
}
//서브클래스에서 상속받은 메소드
@Override
void addSomething() {
Log.d("abcd","설탕 우유 추가");
}
}
//홍차
public class Tea extends makingBeverage{
public void boiledWater() {
Log.d("abcd","물 끓이기");
}
public void pourInCup() {
Log.d("abcd","컵에 담기");
}
//서브클래스에서 상속받은 메소드
@Override
void brewSomething() {
Log.d("abcd","홍차를 우려내기");
}
//서브클래스에서 상속받은 메소드
@Override
void addSomething() {
Log.d("abcd","레몬 추가");
}
}
템플릿 메소드에서는 알고리즘의 각 단계들을 정의하며,
그 중 한개 이상의 단계가 서브클래스에 의해 제공될 수 있습니다.
.
.
추상화 되지 않는 코드와 추상화 된 코드의 다른점
1. 서브클래스에서 코드를 재사용 할 수 있습니다.
2. 알고리즘(makingBeverage)은 한 군데에 모여있기 때문에 그 부분만 고치면 됩니다.
3. 다른 음료를 쉽게 추가할 수 있습니다.
4. makingBeverage 추상클래스에 알고리즘에 대한 지식이 집중되어 있으며, 일부 구현만 서브클래스에 의존합니다.
.
.
.
템플렛 메소드 패턴에서는 메소드에서 알고리즘의 골격을 정의합니다.
알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있습니다.
템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의 할 수 있습니다.
.
.
후크(hook) : 추상클래스에서 선언되는 메소드이지만,
기본적인 내용만 구현되어 있거나 아무 코드도 들어가지 않은 메소드.
예제)
public abstract class makingBeverage {
final void prepare() {
boiledWater();
brewSomething();
pourInCup();
// 여기 조건을 넣어줌
if (customerWantCondiments()) {
addSomething();
}
}
void boiledWater() {
Log.d("abcd","물 끓이기");
}
void pourInCup() {
Log.d("abcd","컵에 따르기");
}
//우려내기
abstract void brewSomething();
//첨가물넣기
abstract void addSomething();
//후크 : 만약 손님이 첨가물을 원한다면,
boolean customerWantCondiments () {
return true;
}
}
public class Coffee extends makingBeverage {
public void boiledWater() {
Log.d("abcd","물 끓이기");
}
public void pourInCup() {
Log.d("abcd","컵에 담");
}
//서브클래스에서 상속받은 메소드
@Override
void brewSomething() {
Log.d("abcd","커피를 우려내기");
}
//서브클래스에서 상속받은 메소드
@Override
void addSomething() {
Log.d("abcd","설탕 우유 추가");
}
public boolean customerWantCondiments() {
String answer = null;
answer = getAnswer();
if (answer.equals("y")) {
return true;
} else {
return false;
}
}
public String getAnswer() {
Log.d("Abcd", "첨가물을 넣어드릴까요? y/n ");
// input 창 추가 (사용자 입력)
if (//만약 사용자의 대답이 y인 경우,) {
return "y";
} else {
return "n";
}
}
}
.
.
.
헐리우드 원칙 : 먼저 연락하지 마세요. 저희가 연락드릴게요.
저수준 구성요소(커피)에서 시스템에 접속을 할 수는 있지만, 언제 어떤 식으로 그 구성요소들을 사용할지는 고수준 구성요소(makingBeverage)에서 결정하게 됩니다.
.
.
.
코틀린
abstract class MakingBeverage {
fun prepare() {
boilWater()
pourInCup()
brewSomething()
addSomething()
}
fun boilWater() {
Log.d("abcd","물 끓이기")
}
fun pourInCup() {
Log.d("abcd","컵에 따르기")
}
abstract fun brewSomething()
abstract fun addSomething()
}
class Coffee : MakingBeverage() {
override fun brewSomething() {
Log.d("abcd","커피 우려내기")
}
override fun addSomething() {
Log.d("abcd","첨가물 추가하")
}
}
반응형
'개발공부 > 디자인 패턴' 카테고리의 다른 글
자바 및 코틀린 퍼사드(facade) 패턴이란? (0) | 2022.02.08 |
---|---|
자바 및 코틀린 어댑터(adapter) 패턴이란? (0) | 2022.02.07 |
자바 및 코틀린 커맨드(command) 패턴이란? (0) | 2022.01.30 |
안드로이드 자바 MVVM패턴 이란? (0) | 2022.01.24 |
안드로이드 자바 MVP패턴 이란? (0) | 2022.01.23 |