초식 디자인 모드 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 디자인 은 흔히 볼 수 있 는 디자인 모델 과 떨 어 질 수 없다. 보통 우리 가 말 하 는 소스 코드 를 읽 는 것 도 큰 소 들 의 디자인 방향 을 배우 기 위해 서 이다.
이 책 에 비해 하나의 이론, 하나의 실천, 실천 은 진 리 를 검증 하 는 유일한 방식 이 고 이론 이 실제 와 결합 하 는 것 이 야 말로 우리 가 발전 하 는 관건 적 인 사상 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.