개발새발/Spring

220131_스프링입문_디자인패턴_데코레이터패턴_패스트캠퍼스 챌린지 08일차

막동이아빠 2022. 1. 31. 23:49

<2022년 01월 31일 _ 패스트캠퍼스 챌린지 08일차>

[스프링입문_디자인패턴_데코레이터패턴]

 

1. Decorator pattern

 : 기존 뼈대(클래스)는 유지하되, 이후 필요한 형태로 꾸밀 때 사용

 : 확장이 필요한 경우 상속의 대안으로도 활용

 : SOLID중에서 개방폐쇄원칙(OCP)의존역전원칙(DIP)를 따름

 

2. 실습

 (1) com.company.design 패키지에 decorator 패키지 추가 & 해당 패키지에 ICar 인터페이스 추가

package com.company.design.decorator;

public interface ICar {

    //가격을 리턴하는 getPrice()
    int getPrice();

    //가격을 보여주는 showPrice();
    void showPrice();
    
}

 (2) ICar를 상속하는 Bmw 클래스 추가

package com.company.design.decorator;

public class Bmw implements ICar{

    //가격
    private int price;

    //기본 생성자에서 가격 초기화
    public Bmw(int price){
        this.price = price;
    }

    //getPrice() 호출 시 price return;
    @Override
    public int getPrice() {
        return price;
    }

    //showPrice() 호출 시 가격 표기
    @Override
    public void showPrice() {
        System.out.println("Bmw 의 가격은 " + this.price + "원 입니다.");
    }
}

 (3) Main문 작성

package com.company.design;

import com.company.design.decorator.Bmw;
import com.company.design.decorator.ICar;

public class Main {

    public static void main(String[] args) {
        ICar bmw = new Bmw(1000);
        bmw.showPrice();
    }
}

 

결과:

 (4) Decorator 를 이용해 차 등급별 구분을 해보자~!

   : BmwDecorator 클래스 추가

package com.company.design.decorator;

public class BmwDecorator implements ICar{

    protected ICar bmw;
    protected String modelName;
    protected int modelPrice;

    public BmwDecorator(ICar bmw, String modelName, int modelPrice){
        this.bmw = bmw;
        this.modelName = modelName;
        this.modelPrice = modelPrice;
    }

    @Override
    public int getPrice() {
        return bmw.getPrice() + modelPrice;
    }

    @Override
    public void showPrice() {
        System.out.println(modelName + "의 가격은 " + getPrice() + " 원 입니다.");
    }
}

(5) 등급별 차종 클래스 추가(Bmw3Series, Bmw4Series, Bmw5Series)

package com.company.design.decorator;

public class Bmw3Series extends BmwDecorator{
    public Bmw3Series(ICar bmw, String modelName) {
        //modelPrice는 받지 않고 직접 정의
        super(bmw, modelName, 1000);
    }
}
package com.company.design.decorator;

public class Bmw4Series extends BmwDecorator{
    public Bmw4Series(ICar bmw, String modelName) {
        //modelPrice는 받지 않고 직접 정의
        super(bmw, modelName, 2000);
    }
}
package com.company.design.decorator;

public class Bmw5Series extends BmwDecorator{
    public Bmw5Series(ICar bmw, String modelName) {
        //modelPrice는 받지 않고 직접 정의
        super(bmw, modelName, 3000);
    }
}

 (6) 등급별 차량 Main문 작성

package com.company.design;

import com.company.design.decorator.*;

public class Main {

    public static void main(String[] args) {
        ICar bmw = new Bmw(1000);
        bmw.showPrice();

        //3시리즈
        ICar bmw3 = new Bmw3Series(bmw, "BMW_3Series");
        bmw3.showPrice();

        //4시리즈
        ICar bmw4 = new Bmw4Series(bmw, "BMW_4Series");
        bmw4.showPrice();

        //5시리즈즈
        ICar bmw5 = new Bmw5Series(bmw, "BMW_5Series");
        bmw5.showPrice();
    }
}

결과:

정리

1. Decorator pattern 데코레이터 패턴을 활용하면, 기본 뼈대는 건들지 않고 부가적인 첨가로 속성을 변화 시킬 수 있다

 

 

7일차 강의 완료~

필기 & 내 화면 스크린샷 저장

https://bit.ly/37BpXiC

 

 

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.