김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • GitHubDesktop
  • local저장소
  • 깃허브데스크탑
  • ㄱ
  • 원격저장소
  • Remote저장소
  • KMU_WINK
  • 로컬저장소

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[디자인패턴-위임패턴] 템플릿 메서드 패턴(Template Method)
• 독서/Design Pattern

[디자인패턴-위임패턴] 템플릿 메서드 패턴(Template Method)

2022. 9. 18. 22:09

# 설명

상위 클래스(추상클래스)에서는 전체적인 흐름을 구현하고 구체적인 내용은 구현하지 않는다. 그 구체적인 처리는 하위 클래스가 상속받아서 정의하도록 한다. 

추상화된 함수를 통해 알고리즘의 단계를 정의하여 처리 순서를 정해 줄 수 있다. 그러나 알고리즘의 내용(구현)은 쉽게 바뀌기 때문에 정의하지 않는다는 것이다.

프레임워크를 사용할때 많이 쓰일 수 밖에 없다. 프레임워크에서는 모든 구동순서를 이미 만들어 놓은 상태로 안에 들어가는 기능만을 우리가 재정의한다. 실제로 안드로이드 개발할때도 많이 마주 했다.

  • 코드 재사용을 위한 기본 기술 중 하나이다.

 

또한 훅 오퍼레이션을 사용 할 수 있다. 아래 예를 보자

public abstract class PlayerLevel {
    public abstract void run();
    public abstract void jump();
    public abstract void atack();
    public void fly() {}
 	
    public final void go(int count){
        run();
        for(int i=0; i<count; i++){
            jump();
        }
        atack();
        fly();
        System.out.println();
    }
}

 예를들어, fly()메서드는 추상클래스내에서는 아무런 기능을 하지 않는다. abstract로 선언하지 않았기때문에 상속받은 클래스에서도 필수적으로 구현할 필요는 없는 메서드이다. 그러나 상속받은 클래스에서 이를 재정의(override)한다면 기능을 사용할 수 있다. 옵셔널한 느낌이다.

# 코드

## Level 관련 클래스

// PlayerLevel - 추상클래스이며 구동의 순서를 정의함

public abstract class PlayerLevel {
    public abstract void run();
    public abstract void jump();
    public abstract void atack();
    public void fly() {}

    public abstract void showLevel();

    public final void go(int count){
        run();
        for(int i=0; i<count; i++){
            jump();
        }
        atack();
        fly();
        System.out.println();
    }
}
// BeginnerLevel

public class BeginnerLevel extends PlayerLevel{

    @Override
    public void run() {
        System.out.println("초급자 달리기!! 매우 느림");
    }

    @Override
    public void jump() {
        System.out.println("초급자 점프!! 매우 낮음");
    }

    @Override
    public void atack() {
        System.out.println("초급자 공격!! 공격력 1");
    }

    @Override
    public void showLevel() {
        System.out.println("======@BeginnerLevel@======");
    }
}
// AdvancedLevel

public class AdvancedLevel extends PlayerLevel{
    @Override
    public void run() {
        System.out.println("상급자 달리기!! 빠름");
    }

    @Override
    public void jump() {
        System.out.println("상급자 점프!! 높음");
    }

    @Override
    public void atack() {
        System.out.println("상급자 공격!! 공격력 10");
    }

    @Override
    public void showLevel() {
        System.out.println("======@AdvancedLevel@======");
    }
}
// SuperLevel - 훅 오퍼레이션을 사용하기 위해 fly()를 재정의해줌


public class SuperLevel extends PlayerLevel{
    @Override
    public void run() {
        System.out.println("운영자 달리기!! 텔레포트급임");
    }

    @Override
    public void jump() {
        System.out.println("운영자 점프!! 개높음");
    }

    @Override
    public void atack() {
        System.out.println("운영자 공격!! 한방컷");
    }

    @Override
    public void showLevel() {
        System.out.println("======@SuperLevel@======");
    }

    @Override
    public void fly() {
        System.out.println("운영자는 날수 있습니다!");
    }
}

## Player 

// Player

public class Player {
    PlayerLevel myLevel;

    public Player(){
        System.out.println("캐릭터가 생성 됐습니다");
        myLevel = new BeginnerLevel();
        myLevel.showLevel();
    }

    public void levelUp(PlayerLevel level) {
        level.showLevel();
        myLevel = level;
    }

    public void play(int jumpCount) {
        myLevel.go(jumpCount);
    }

}

 

# 테스트

// Test 
public class Test {
    public static void main(String[] args) {

        Player hojun = new Player();
        hojun.play(3);

        PlayerLevel advanced = new AdvancedLevel();
        hojun.levelUp(advanced);
        hojun.play(2);

        PlayerLevel superLevel = new SuperLevel();
        hojun.levelUp(superLevel);
        hojun.play(3);
    }
}

  • Player.play()를 호출함으로써  이미 정해진 구동순서에 의해 다르게 정의된 기능을 실행 할 수 있음.
  • SuperLevel에서는 fly()인 훅 오퍼레이션을 사용하여 추가 기능이 구현 됨
저작자표시 (새창열림)

'• 독서 > Design Pattern' 카테고리의 다른 글

[디자인패턴] 전략패턴 (Strategy Pattern)  (1) 2022.09.21
[디자인패턴-위임/팩토리패턴] 팩토리 메소드 패턴 (Factory-Method Pattern)  (2) 2022.09.20
[디자인패턴-생성패턴] 빌더 패턴(Builder Pattern)  (2) 2022.09.17
[디자인패턴-생성패턴] 추상팩토리 패턴(Abstract-Factory pattern)  (0) 2022.09.17
[디자인패턴-생성패턴] 프로토타입 패턴(Prototype Pattern)  (0) 2022.09.16
    '• 독서/Design Pattern' 카테고리의 다른 글
    • [디자인패턴] 전략패턴 (Strategy Pattern)
    • [디자인패턴-위임/팩토리패턴] 팩토리 메소드 패턴 (Factory-Method Pattern)
    • [디자인패턴-생성패턴] 빌더 패턴(Builder Pattern)
    • [디자인패턴-생성패턴] 추상팩토리 패턴(Abstract-Factory pattern)
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바