자바 디자인 모드-장식 자 모드 상세 설명
수요:현재 아 이 템 커피:에 스프 레 소(이 태 리 진 한 커피)와 롱 블랙(아메리카 노),소스 는 밀 크(우유)와 슈 가(설탕),고객 은 아 이 템 커피 나 아 이 템 커피+소스 의 조합 을 주문 하여 해당 비용 을 계산 할 수 있 습 니 다.새로운 커피 종 류 를 확장 할 때 좋 은 확장 성 을 가지 고 유지 보수 가 편리 하도록 요구한다.
벽돌 을 던 져 옥 을 끌 어 들 이 고,우 리 는 먼저 두 가지 일반적인 해법 을 보 자.
일반 해법
방안 1.
모든 조합 을 만 들 수 있 습 니 다.
Drink
추상 류 는 음 료 를 나타 내 고cost()
방법 으로 가격 을 계산 합 니 다.예 를 들 어Longblack_Milk
는 아메리카 노 에 우 유 를 넣 는 것 을 나타 냅 니 다.이런 디자인 은 매우 현명 하지 못 하고 여러 가지 종류 가 있 을 수 있다.아 이 템 커피 나 양념 을 추가 하면 종류 가 배로 늘 어 나 폭발 할 수 있다.
방안 2.
양념 을
Drink
류 에 넣 고 과 다 하 게 줄 입 니 다.방안 2.여러 가지 유형 을 만 들 지 는 않 지만 소스 를 증가 하거나 삭제 할 때 코드 유 지 량 은 여전히 크다.
장식 자 모드
장식 자 모드(Decorator Pattern)는 구조 형 모델 로 장식 기 모드/장식 모드 라 고도 부른다.그것 은 새로운 기능 을 대상 에 동적 으로 추가 할 수 있 으 며 구 조 를 바 꾸 지 않 는 다.대상 기능 확장 에 있어 서 는 계승 보다 탄력 이 있다.이 모델 은 기 존의 종 류 를 포장 하고 클래스 방법 서명 의 완전 성 을 유지 하 는 전제 에서 추가 적 인 기능 을 제공 하 는 장식 류 를 만 들 었 다.
아 날로 그:
장식 자 해법
아 날로 그:
Drink 류 는 앞에서 말 한 추상 류 Decorator 가 하나의 장식 류 로 장식 대상(Drink obj)과 cost()방법 을 포함 하여 하나의 비용 을 중첩 계산 하 는 것 이다.재 귀적 인 계산 가격 인 Milk 과 Suger 는 구체 적 인 장식 자 Coffee 는 피 장식 자 주체 인 LongBlack 과 Espresso 가 구체 적 으로 실 현 된 피 장식 자 실체 이다.
코드:
추상 류
public abstract class Drink {//
public String des; //
private float price = 0.0f;
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
//
public abstract float cost();
}
장식 자
public class Decorator extends Drink {//
private Drink obj;
public Decorator(Drink obj) { //
this.obj = obj;
}
@Override
public float cost() {
// getPrice
return super.getPrice() + obj.cost();
}
@Override
public String getDes() {
// obj.getDes()
return des + " " + getPrice() + " && " + obj.getDes();
}
}
public class Milk extends Decorator {//
public Milk(Drink obj) {
super(obj);
setDes(" ");
setPrice(2.0f);
}
}
public class Suger extends Decorator {//
public Suger(Drink obj) {
super(obj);
setDes(" ");
setPrice(1.0f);
}
}
피 장식 자
public class Coffee extends Drink {//
@Override
public float cost() {
return super.getPrice();
}
}
public class Espresso extends Coffee {//
public Espresso() {
setDes(" ");
setPrice(6.0f);
}
}
public class LongBlack extends Coffee {//
public LongBlack() {
setDes(" ");
setPrice(5.0f);
}
}
클 라 이언 트 테스트
public class Client {
public static void main(String[] args) {
// : 、
// 1. Espresso
Drink order = new Espresso();
System.out.println("order1 =" + order.cost());
System.out.println("order1 =" + order.getDes());
// 2.1 order
order = new Milk(order);
System.out.println("order =" + order.cost());
System.out.println("order = " + order.getDes());
// 2.2 order
order = new Milk(order);
System.out.println("order =" + order.cost());
System.out.println("order = " + order.getDes());
// 3. order
order = new Suger(order);
System.out.println("order 、 =" + order.cost());
System.out.println("order 、 = " + order.getDes());
System.out.println("===========================");
//
//1. LongBlack
Drink order2 = new LongBlack();
System.out.println("order2 =" + order2.cost());
System.out.println("order2 = " + order2.getDes());
//2. order2
order2 = new Milk(order2);
System.out.println("order2 =" + order2.cost());
System.out.println("order2 = " + order2.getDes());
}
}
실행 결과:요약:
장식 자 모드 는 택 배 를 포장 하 는 것 과 같 습 니 다.끊임없이 새로운 기능 을 추가 하면 모든 상황 을 조합 할 수 있 습 니 다.
첫 번 째 밀 크 에는 에 스프 레 소 가 포함 되 어 있 습 니 다.
두 번 째 우유 포함(Milk+Espresso)
Suger 포함(Milk+Milk+Espresso)
이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.