초식 디자인 모드 chapter 03 - 장식 자 모드

디자인 모드 chapter 03 - 장식 자 모드
머리말
이 장 은 '사랑 으로 물 려 받 은 사람 에 게 새로운 디자인 의 시 야 를 준다' 고 할 수 있다.
우 리 는 전형 적 인 계승 남용 문 제 를 다시 토론 할 것 이다. 장식 자 모델 의 기 교 를 잘 알 게 되면 그 어떠한 바 텀 코드 도 수정 하지 않 은 상태 에서 당신 의 (또는 다른 사람의) 대상 에 게 새로운 직책 을 부여 할 수 있 을 것 이다.
본문
2.1 본 장의 수요 배경
1. 커피숍 에는 네 가지 원자재 커피 가 있 습 니 다. 종합, 깊 은 베 이 킹, 저 카페인, 농축, 네 가지 양념: 우유, 모 카, 두유, 우유 거품;
2. 원자재 와 양념 을 임의로 배합 하여 새로운 음 료 를 만 들 수 있 고 후기 에는 새로운 원자재 와 양념 을 넣 을 수 있다.
단순히 모든 커피 (원자재 + 양념) 에 하나의 유형 (인터페이스) 을 만 들 면 가장 서 툰 방법 이 고 디자인 원칙 에 어 긋 난다. 포장 변화 (재료 가격) 는 조합 을 많이 사용 하고 계승 을 적 게 사용 하 는 것 이다.
public class Beverage
{
    //           
    public void cost()
    {
         float condimentCost = 0.0;
         if(hasMilk)
         {
             condimentCost += milkCost;
         }
         //             
    }
}

그리고 각 원자 재 를 위 한 종 류 를 만들어 Beverage 를 계승 하고 cost () 방법 에 원자재 가격 을 더 해 최종 음료 가격 을 얻는다.
이상 디자인 의 단점:
1. 새로운 양념 이 나 오 면 Bererage 코드 를 수정 해 야 합 니 다.
2. 특정한 원자 재 를 바탕 으로 하 는 음 료 는 모든 양념 을 포함 하지 않 는 다. 예 를 들 어 Tea 를 추가 하 는 것 이다.
3. 만약 에 고객 이 2 인분 의 양념 이 필요 하 다 면?
여기에 새로운 디자인 원칙 을 도입 한다.
클래스 는 확장 에 개방 하고 수정 에 대해 닫 아야 합 니 다.
우리 의 목 표 는 클래스 가 쉽게 확장 되 고 기 존 코드 를 수정 하지 않 은 상태 에서 새로운 행동 을 조합 할 수 있 도록 하 는 것 입 니 다.만약 이런 목 표를 실현 할 수 있다 면 어떤 좋 은 점 이 있 습 니까?
이러한 디자인 은 신축성 이 있어 change 에 대응 할 수 있 고 새로운 기능 을 받 아들 여 변화의 수요 에 대응 할 수 있다.
확장 이 필요 한 코드 부분 을 선택 할 때 조심해 야 합 니 다.모든 지역 이 개방 - 폐쇄 원칙 을 채택 하 는 것 은 낭비 이 고 필요 도 없 으 며 결국은 코드 가 복잡 하고 이해 하기 어 려 울 것 이다.
2.2 인식 장식 자 모델
현재 알 고 있 는 장식 자 에 대한 모든 것:
1. 장식 자 와 피 장식 자의 대상 은 같은 초 유형 을 가진다.
2. 당신 은 한 개 또는 여러 개의 장식 자로 대상 을 포장 할 수 있 습 니 다.
3. 장식 자 와 피 장식 대상 이 똑 같은 초 유형 을 가지 기 때문에 원시 대상 이 필요 한 모든 장소 에서 장식 한 대상 으로 대체 할 수 있다.
4. 장식 자 는 의뢰 한 피 장식 자의 행위 전과 / 또는 그 후에 자신의 행 위 를 더 하여 특정한 목적 을 달성 할 수 있다.
5. 대상 은 언제든지 장식 할 수 있 기 때문에 운행 할 때 동적 이 고 무제 한 당신 이 좋아 하 는 장식 자로 대상 을 장식 할 수 있 습 니 다.
장식 자 모드: 동적 으로 책임 을 대상 에 부가 합 니 다.기능 을 확장 하려 면 장식 자 는 계승 보다 더 탄력 있 는 대체 방안 을 제공 합 니 다.
이 장의 수요 배경 을 기억 하 십 니까?안에 언급 된 원자 재 는 장식 자의 대상 이 고 양념 은 장식 자 이다.
상기 분석 을 바탕 으로 우 리 는 Beverage 를 장식 자 대상 과 장식 자의 초 류 로 하고 장식 자 대상 은 Beverage 류 를 직접 계승 하여 모든 양념 류 에 초 류 condimentDecorator (추상 장식 자) 를 디자인 하여 Beverage 류 에 계승 한다.
Beverage 클래스 정의
public abstract class Beverage {
	String description = "Unknown Beverage";
  
	public String getDescription() {
		return description;
	}
 
	public abstract double cost();
}

CondimentDecorator 클래스 정의
public abstract class CondimentDecorator extends Beverage {
	public abstract String getDescription();
}

원자재 류 정의
public class Espresso extends Beverage {
  
	public Espresso() {
		description = "Espresso";
	}
  
	public double cost() {
		return 1.99;
	}
}

양념 류 정의
public class Soy extends CondimentDecorator {
	Beverage beverage;

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

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

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

테스트 코드
public class StarbuzzCoffee {
 
	public static void main(String args[]) {
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() 
				+ " $" + beverage.cost());
 
		Beverage beverage2 = new DarkRoast();
		beverage2 = new Mocha(beverage2);
		beverage2 = new Mocha(beverage2);
		beverage2 = new Whip(beverage2);
		System.out.println(beverage2.getDescription() 
				+ " $" + beverage2.cost());
 
		Beverage beverage3 = new HouseBlend();
		beverage3 = new Soy(beverage3);
		beverage3 = new Mocha(beverage3);
		beverage3 = new Whip(beverage3);
		System.out.println(beverage3.getDescription() 
				+ " $" + beverage3.cost());
	}
}

2.3 진실 한 세계 의 장식 자
java. io 가방 에 클래스 가 너무 많아 서 그야말로 산 이 무 너 지고 바다 가 무 너 집 니 다.다음은 전형 적 인 대상 집합 입 니 다. 장식 자로 기능 을 결합 시 켜 파일 데 이 터 를 읽 습 니 다.
초 클래스: InputStream
구성 요소: FileInputStream, StringBufferInputStream, ByteArrayInputStream
추상 장식 자: FilterInputStream
구체 적 인 장식 자: PushBackInputStream, BufferedInputStream, DataInputStream, LineNumberInputStream
그러나 자바 I / O 도 장식 자 모델 의 '단점' 을 가 져 왔 다. 장식 자 모델 을 이용 하여 디자인 에 대량의 작은 유형 이 있 고 수량 이 너무 많아 서 이 API 프로그래머 에 게 어려움 을 줄 수 있다.
그러나 이 제 는 장식 자의 업무 가 원래 의 것 임 을 알 게 되 었 습 니 다. 나중에 다른 사람의 대량의 장식 API 를 사용 할 때 그들의 장식 자 류 를 어떻게 조직 하 는 지 쉽게 식별 할 수 있 고 포장 방식 으로 원 하 는 행 위 를 얻 을 수 있 습 니 다.
3 장 소결
장식 자 모델 은 JDK 에서 많이 사용 하 는 또 다른 디자인 모델 이다. 하 나 는 관찰자 모델 (Swing 에서 대량으로 사용) 이다. 업계 에서 좋 은 API 디자인 은 흔히 볼 수 있 는 디자인 모델 과 떨 어 질 수 없다. 보통 우리 가 말 하 는 소스 코드 를 읽 는 것 도 큰 소 들 의 디자인 방향 을 배우 기 위해 서 이다.
이 책 에 비해 하나의 이론, 하나의 실천, 실천 은 진 리 를 검증 하 는 유일한 방식 이 고 이론 이 실제 와 결합 하 는 것 이 야 말로 우리 가 발전 하 는 관건 적 인 사상 이다.

좋은 웹페이지 즐겨찾기