<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일차 강의 완료~
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'개발새발 > Spring' 카테고리의 다른 글
220202_스프링입문_디자인패턴_파사드 패턴_패스트캠퍼스 챌린지 10일차 (0) | 2022.02.02 |
---|---|
220201_스프링입문_디자인패턴_옵저버 패턴_패스트캠퍼스 챌린지 09일차 (0) | 2022.02.01 |
220130_스프링입문_디자인패턴_프록시패턴_패스트캠퍼스 챌린지 07일차 (0) | 2022.01.30 |
220129_스프링입문_디자인패턴_어댑터패턴_패스트캠퍼스 챌린지 06일차 (0) | 2022.01.29 |
220129_스프링입문_디자인패턴_싱글톤패턴_패스트캠퍼스 챌린지 06일차 (0) | 2022.01.29 |