# 설명
상위 클래스(추상클래스)에서는 전체적인 흐름을 구현하고 구체적인 내용은 구현하지 않는다. 그 구체적인 처리는 하위 클래스가 상속받아서 정의하도록 한다.
추상화된 함수를 통해 알고리즘의 단계를 정의하여 처리 순서를 정해 줄 수 있다. 그러나 알고리즘의 내용(구현)은 쉽게 바뀌기 때문에 정의하지 않는다는 것이다.
프레임워크를 사용할때 많이 쓰일 수 밖에 없다. 프레임워크에서는 모든 구동순서를 이미 만들어 놓은 상태로 안에 들어가는 기능만을 우리가 재정의한다. 실제로 안드로이드 개발할때도 많이 마주 했다.
- 코드 재사용을 위한 기본 기술 중 하나이다.
또한 훅 오퍼레이션을 사용 할 수 있다. 아래 예를 보자
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 |