닭발개발

[헤드퍼스트 디자인패턴] 9일차. 126-139pg 본문

책책책 책을 읽읍시다‼ ver.개발/[ 헤드퍼스트 디자인패턴 ]

[헤드퍼스트 디자인패턴] 9일차. 126-139pg

D269 2023. 5. 4. 13:45
728x90

 

9일차

헤드퍼스트 디자인패턴 [수요일]

126-139pg

요약

CHAPTER 03. 객체 꾸미기 (feat. 데코레이터 패턴)

 

[ Beverage 클래스 작성하기 ]

어떤 구성 요소를 가지고 데코레이터를 만들 때 새로운 행동을 추가하지. 새로운 행동은 객체를 구성해서 얻는 거잖아. 슈퍼클래스로부터 행동을 상속받아서 얻는 것이 아님.

→ 행동을 상속받으려고 Beverage의 서브클래스를 만든 게 아니라 형식을 맞추려고 한 것.

 

if 상속만 써야 했다면

행동이 컴파일 시에 정적으로 결정되어 버림. 슈퍼클래스에서 받은 것과 코드로 오버라이드한 것만 쓸 수 있음.

 

[ 코드구현 ]

Beverage는 추상 구성요소,

HousBlend는 구상 구성요소

추상데코레이터 (CondimentDecorator)

구상데코레이터 - 모카

 

모카 인스턴스에 필요한 것.

  1. 감싸고자 하는 음료를 저장하는 인스턴스 변수
  2. 인스턴스 변수를 감싸고자 하는 객채로 설정하는 생성자

 

[ 데코레이터 적용 예 : 자바 I/O ]

InputStream : 추상 구성 요소

FileInputStream, StringBufferInputStream, ByteArrayInputStream : 구상 구성요소

PushbackInputStream, BufferedInputStream : 구상 데코레이터

 

[ 디자인 도구 상자 ]

객체지향 원칙 : 클래스는 확장에는 열려있어야 하지만 변경에는 닫혀 있어야 한다.(OCP)

객체지향 패턴 : 데코레이터 패턴

발췌

💡 주의! 구상 구성 요소로 돌아가는 코드를 만들어야 한다면 데코레이터 패턴 사용을 다시 한번 생각해보자
💡 데코레이터를 도입하면 구성요소를 초기화 하는데 필요한 코드가 훨씬 복잡해진다.

 

메모

-없음

 

 

숙제

숙제1. 이미지

숙제2. 131p

두유(Soy)와 휘핑크림(Whip)용 코드 만들기

public class Soy extends CondimentDecorator {

	
	public Soy (Beverage beverage) {
		this.beverage = beverage;
	}

	public String getDescription() {
		return beverage.getDescription() + ", 두유";
	}

	public double cost() {
		return beverage.cost() + .15;
	}
}
public class Whip extends CondimentDecorator {

	
	public Whip (Beverage beverage) {
		this.beverage = beverage;
	}

	public String getDescription() {
		return beverage.getDescription() + ", 휘핑크림";
	}

	public double cost() {
		return beverage.cost() + .10;
	}
}

 

 

 

 

728x90
반응형