[자바 디자인패턴 소스코드] Template Pattern

템플릿 패턴

/**
 * [템플릿 패턴]은 전체적인 알고리즘은 상위 클래스에서 구현하면서
 * 다른 부분은 하위 클래스에서 구현할 수 있도록 하는 디자인 패턴이다.
 * 전체적인 알고리즘 코드를 재사용하는 데 유용하다.
 */
public class TemplatePattern {
    public static void main(String[] args) {
        Fan fan = new Fan();
        Samsung samsungAirConditioner = new Samsung(fan);
        samsungAirConditioner.changeTemp(UPDOWN.UP);
        samsungAirConditioner.changeTemp(UPDOWN.DOWN);

        LG LGAirConditioner = new LG(fan);
        LGAirConditioner.changeTemp(UPDOWN.DOWN);
        LGAirConditioner.changeTemp(UPDOWN.UP);
    }
}

enum FANSTATUS {ON, OFF}
enum TEMPRATURE {
    EIGHTEEN(18), NINETEEN(19), TWENTY(20);
    int value;
    private TEMPRATURE(int value){
        this.value = value;
    }
    public int getValue(){
        return value;
    }
}
enum UPDOWN {
    UP("up"), DOWN("down");
    String value;
    private UPDOWN(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
abstract class AirConditioner {
    private Fan fan;
    private TEMPRATURE temprature;

    public AirConditioner(Fan fan) {
        this.fan = fan;
        temprature = TEMPRATURE.NINETEEN;
    }

    public TEMPRATURE getTempStatus() {
        return temprature;
    }

    private void setTempStatus(TEMPRATURE temprature) {
        this.temprature = temprature;
        System.out.println(this.temprature.getValue());
    }

    public void changeTemp(UPDOWN updown) {
        TEMPRATURE temprature = getTempStatus();
        FANSTATUS fanStatus = fan.getFanStatus();

        if(fanStatus == FANSTATUS.OFF) {
            System.out.println("fan on.");
            fan.open();
        }

        if(UPDOWN.UP == updown) {
            if(temprature == TEMPRATURE.EIGHTEEN) {
                temprature = TEMPRATURE.NINETEEN;
            }
            else if(temprature == TEMPRATURE.NINETEEN) {
                temprature = TEMPRATURE.TWENTY;
            }
        }
        else if(UPDOWN.DOWN == updown) {
            if(temprature == TEMPRATURE.TWENTY) {
                temprature = TEMPRATURE.NINETEEN;
            }
            else if(temprature == TEMPRATURE.NINETEEN) {
                temprature = TEMPRATURE.EIGHTEEN;
            }
        }

        turn(updown);

        System.out.print(" turn " + updown.getValue() + " ");
        setTempStatus(temprature);
    }

    protected abstract void turn(UPDOWN updown);
}

class Samsung extends AirConditioner {
    public Samsung(Fan fan) {
        super(fan);
    }

    @Override
    protected void turn(UPDOWN updown) {
        System.out.print("Samsung: ");
    }
}

class LG extends AirConditioner {
    public LG(Fan fan) {
        super(fan);
    }

    @Override
    protected void turn(UPDOWN updown) {
        System.out.print("LG: ");
    }
}

class Fan {
    private FANSTATUS fanStatus;

    public Fan() {
        fanStatus = FANSTATUS.OFF;
    }

    public FANSTATUS getFanStatus() {
        return fanStatus;
    }

    public void close() {
        fanStatus = FANSTATUS.OFF;
    }

    public void open() {
        fanStatus = FANSTATUS.ON;
    }
}

 

이 글을 공유하기

댓글

Designed by JB FACTORY