자바 디자인 모드-장식 자 모드 상세 설명

예 를 들다
수요:현재 아 이 템 커피:에 스프 레 소(이 태 리 진 한 커피)와 롱 블랙(아메리카 노),소스 는 밀 크(우유)와 슈 가(설탕),고객 은 아 이 템 커피 나 아 이 템 커피+소스 의 조합 을 주문 하여 해당 비용 을 계산 할 수 있 습 니 다.새로운 커피 종 류 를 확장 할 때 좋 은 확장 성 을 가지 고 유지 보수 가 편리 하도록 요구한다.
벽돌 을 던 져 옥 을 끌 어 들 이 고,우 리 는 먼저 두 가지 일반적인 해법 을 보 자.
일반 해법
방안 1.
모든 조합 을 만 들 수 있 습 니 다.Drink추상 류 는 음 료 를 나타 내 고cost()방법 으로 가격 을 계산 합 니 다.예 를 들 어Longblack_Milk는 아메리카 노 에 우 유 를 넣 는 것 을 나타 냅 니 다.
在这里插入图片描述
이런 디자인 은 매우 현명 하지 못 하고 여러 가지 종류 가 있 을 수 있다.아 이 템 커피 나 양념 을 추가 하면 종류 가 배로 늘 어 나 폭발 할 수 있다.
방안 2.
양념 을Drink류 에 넣 고 과 다 하 게 줄 입 니 다.
在这里插入图片描述
방안 2.여러 가지 유형 을 만 들 지 는 않 지만 소스 를 증가 하거나 삭제 할 때 코드 유 지 량 은 여전히 크다.
장식 자 모드
장식 자 모드(Decorator Pattern)는 구조 형 모델 로 장식 기 모드/장식 모드 라 고도 부른다.그것 은 새로운 기능 을 대상 에 동적 으로 추가 할 수 있 으 며 구 조 를 바 꾸 지 않 는 다.대상 기능 확장 에 있어 서 는 계승 보다 탄력 이 있다.이 모델 은 기 존의 종 류 를 포장 하고 클래스 방법 서명 의 완전 성 을 유지 하 는 전제 에서 추가 적 인 기능 을 제공 하 는 장식 류 를 만 들 었 다.
아 날로 그:
在这里插入图片描述
  • Component 추상 류:주체,예 를 들 어 앞의 Drink 와 유사 하 다.
  • Concrete Component 류:구체 적 인 주체,예 를 들 어 앞의 아 이 템 커피.
  • Decorator 류:장식 자,예 를 들 어 앞의 양념
  • Concrete Decorator 류:구체 적 인 장식 자,예 를 들 어 앞의 우유.
  • 만약 에 Concrete Component 의 구체 적 인 하위 클래스 가 많다 면 중간 층 을 하나 더 추가 하여 공동 부분 을 추출 하고 계승 을 통 해 더욱 다른 구체 적 인 하위 클래스 를 실현 할 수 있다.
    장식 자 해법
    아 날로 그:
    在这里插入图片描述
    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)
    이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!

    좋은 웹페이지 즐겨찾기