본문 바로가기
Theory/Design Pattern

Template Method Pattern

by y.j 2022. 5. 22.
728x90

Template Method Pattern

알고리즘에서 특정 step만을 수정할 때 사용한다.

subclass의 operation을 바꾸고 싶을 때 parent class에서 상속받아 재정의 한다. 하지만 이것은 전체를 다시 다 정의해야 하며 특정 부분만을 수정하는 것이 불가능하다. template method는 불변하는 코드와 변하는 코드를 나눠 불변하는 코드의 중복을 없애는 방법이다.

 

Solution

변하는 코드를 함수(primitive)로 바꾸어 subclass에서 상속하여 변경시킨다. 반면에 불변 코드는 상위 클래스에 그대로 둔다.

 

Motor

public abstract class Motor {
    protected Door door;
    private MotorStatus motorStatus;
    public Motor(Door door) {
        this.door = door;
        this.motorStatus = MotorStatus.STOPPED;
    }

    public MotorStatus getMotorStatus() {
        return motorStatus;
    }

    public void setMotorStatus(MotorStatus motorStatus) {
        this.motorStatus = motorStatus;
    }

    protected abstract void moveMotor(Direction direction);

    public void move(Direction direction) {
        MotorStatus status = getMotorStatus();
        if(status == MotorStatus.MOVING) return;
        if(door.getDoorStatus() == DoorStatus.OPENED) door.closed();
        
        // 변하는 코드
        moveMotor(direction);
        
        
        setMotorStatus(MotorStatus.MOVING);
    }
}

 

상속받은 class

public class HyundaiMotor extends Motor {

    public HyundaiMotor(Door door) {
        super(door);
    }
    @Override
    protected void moveMotor(Direction direction) {
        System.out.println("Hyundai Motor is moving toward " + direction.toString());
    }
}

 

Advantages

• 코드 재사용성이 증가한다.
• Inversion of Control

 - template methods는 parent class의 행위를 재정의 하지 않는다.

 

[전체코드]

https://github.com/jKyounju/adapterPatterns/tree/master/src/BehavioralPattern/TemplateMethodPattern

https://github.com/jKyounju/adapterPatterns/blob/master/test/BehavioralPattern/TemplateMethodPatternTest.java

 

[참고]

https://gmlwjd9405.github.io/2018/07/13/template-method-pattern.html

728x90

'Theory > Design Pattern' 카테고리의 다른 글

MVC Pattern  (0) 2022.05.23
Visitor Pattern  (0) 2022.05.22
Strategy Pattern  (0) 2022.05.22
State Pattern  (0) 2022.05.21
Observer Pattern  (0) 2022.05.21

댓글