자바 디자인 모드-조합 모드 상세 설명

조합 모드
조합 모드(Composite Pattern)는 일부 전체 모델 이 라 고도 부 르 는데 비슷 한 대상 을 하나의 대상 으로 하 는 데 사용 된다.조합 모델 은 나무 구조 에 따라 대상 을 조합 하여 부분 과 전체적인 차원 을 나타 낸다.이런 유형의 디자인 모델 은 구조 형 모델 로 대상 그룹의 트 리 구 조 를 만 들 었 다.
4.567917.주요 해결:이 는 우리 나무 구조의 문제 에서 간단 한 요소 와 복잡 한 요소 의 개념 을 모호 하 게 하고 고객 프로그램 은 간단 한 요 소 를 처리 하 는 것 처럼 복잡 한 요 소 를 처리 하여 고객 프로그램 과 복잡 한 요소 의 내부 구 조 를 결합 시 킬 수 있다4.567917.어떻게 해결 합 니까?나뭇가지 와 잎 은 통 일 된 인 터 페 이 스 를 실현 하고 나뭇가지 내부 에 이 인 터 페 이 스 를 조합 합 니 다언제 사용 합 니까?
1.대상 의 부분-전체 차원 구조(트 리 구조)를 표시 하고 싶 습 니 다.
2.사용자 가 조합 대상 과 하나의 대상 이 다 르 기 를 무시 하고 사용 자 는 조합 구조의 모든 대상 을 통일 적 으로 사용 하 기 를 바 랍 니 다.
4.567917.장면 사용:부분,전체 장면,예 를 들 어 트 리 메뉴,파일,폴 더 의 관리장점.
결점.
고 층 모듈 호출 이 간단 하고 노드 가 자 유 롭 게 증가 합 니 다.
잎 과 나뭇가지 의 성명 은 인터페이스 가 아 닌 실현 류 로 거꾸로 의존 하 는 원칙 을 위반 했다.
在这里插入图片描述
폴 더-파일 의 트 리 구 조 는 낯 설 지 않 을 것 입 니 다.파일 은 잎 노드(단일 대상)로 보고 폴 더 는 중간 노드(조합 대상)로 봅 니 다.
조합 모드 는 사용자 로 하여 금 하나의 대상 과 조합 대상 에 대한 방문 이 일치 성 을 가지 게 한다.즉,사용자 로 하여 금 일치 하 는 방식 으로 개별 대상 과 조합 대상 을 처리 하 게 한다.사용 과정 에서 구분 되 어 번 거 로 움 을 초래 하 는 것 을 피하 다.
在这里插入图片描述
  • Component:조합 중의 대상 성명 인터페이스 로 Component 하위 위 젯 에 접근 하고 관리 할 수 있 습 니 다
  • Leaf:단일/잎 대상,잎 결산 점 에는 자결 점 이 없다
  • Composite:조합/용기 대상,하위 위 젯 과 노드 행 위 를 저장 하고 하위 위 젯 과 관련 된 작업 을 실현 합 니 다.예 를 들 어 추가(add)와 삭제(remove)등 list 는 용 기 를 실현 하고 Component 대상 을 수용 합 니 다
  • Demo
    먼저 일반적인 문법 을 살 펴 보 자.
    在这里插入图片描述
    사용자 가 하나의 할인 방안 만 만족 할 때 이런 방법 은 대응 할 수 있다.
    그러나 알뜰 하 게 계산 하 는 우 리 는 여러 가지 할인 방안 을 동시에 만족 시 킬 수 있다.이때 조합 모델 로 이런 단일 할인 방안 을 조합 하여 수용 한 다음 에 할인 충돌 해결 전략 을 정의 할 수 있다.단일 대상 과 조합 대상 의 통일 을 실현 하여 호출 자가 사용 할 때 구분 하지 않도록 한다.
    在这里插入图片描述
    조합 대상 Composite Discount 를 추상 적 인 유형 으로 정의 하고 Single MinStrategy 와 Multiple Strategy 가 이 를 계승 하여 충돌 을 해결 하 는 전략 을 나타 낸다.각각 최소 할인 과 할인 을 받 는 것 이다.
    일반적으로 할인 충돌 을 해결 하 는 것 은 모두 할인 이지 만 업 체 들 은 더욱 똑똑 하고 상호 배척 권 같은 것 을 내 놓 으 면 최소 할인 을 받는다.다른 할인 충돌 정책 도 사용자 정의 할 수 있 습 니 다.
    약간의 공장 모델 과 전략 모델 과 관련 되 었 는데 DiscountFactory 는 Order 류 의 속성 Discount Strategy 를 실례 화 하 는 공장 으로 각종 할인 전략 은 같은 인 터 페 이 스 를 실현 한다.
    코드:
    
    public interface DiscountStrategy {
        public double getTotal(double price);
    }
    public class VIPDiscount implements DiscountStrategy {
        //95 
        @Override
        public double getTotal(double price) {
            return 0.95*price;
        }
    }
    public class ActivityDiscount implements DiscountStrategy{
        //9 
        @Override
        public double getTotal(double price) {
            return 0.9*price;
        }
    }
    public class StoreDiscount implements DiscountStrategy{
        // 500     6 
        @Override
        public double getTotal(double price) {
            return 500+0.6*(price-500);
        }
    }
    
    
    public abstract class CompositeDiscount implements DiscountStrategy {
        protected List<DiscountStrategy> strategies =new ArrayList(); //  
        public void add(DiscountStrategy discountStrategy){ //      
            strategies.add(discountStrategy);
        }
        @Override
        public double getTotal(double price) {
            return price;
        }
    }
    //         
    public class SingleMinStrategy extends CompositeDiscount {
        @Override
        public double getTotal(double price) {
            double rtn=price;
            for (DiscountStrategy s: strategies) {
                rtn=Math.min(rtn,s.getTotal(price));
            }
            return rtn;
        }
    }
    //        
    public class MultipleStrategy extends CompositeDiscount {
        @Override
        public double getTotal(double price) {
            double rtn = price;
            for (DiscountStrategy s : strategies) {
                rtn = s.getTotal(rtn);
            }
            return rtn;
        }
    }
    
    
    public class DiscountFactory {
        public DiscountStrategy create(String type){ //         
            //      
            if("ynn".equals(type))return new VIPDiscount();
            else if("nyn".equals(type))return new StoreDiscount();
            else if("nny".equals(type))return new ActivityDiscount();
            else{  //      
                CompositeDiscount compositeDiscount;
                System.out.println("         :1.    2.   ");
                Scanner scanner=new Scanner(System.in);
                int type2=scanner.nextInt();
                if(type2==1){
                    compositeDiscount=new MultipleStrategy();
                }
                else{
                    compositeDiscount=new SingleMinStrategy();
                }
                if(type.charAt(1)=='y')compositeDiscount.add(new StoreDiscount());
                if(type.charAt(0)=='y')compositeDiscount.add(new VIPDiscount());
                if(type.charAt(2)=='y')compositeDiscount.add(new ActivityDiscount());
                return compositeDiscount;
            }
        }
    }
    
    
    public class Order {
        public double price;
        private String type;
        public DiscountStrategy discountStrategy;
        public Order(double price) {
            this.price=price;
        }
        public void display(){
            System.out.println("  :"+price);
            System.out.println("   VIP?y/n");
            Scanner scanner=new Scanner(System.in);
            type=scanner.next();
            System.out.println("    500?y/n");
            String tmp;
            tmp=scanner.next();
            type+=tmp;
            System.out.println("       ?y/n");
            tmp=scanner.next();
            type+=tmp;
            DiscountFactory discountFactory=new DiscountFactory();
            double discountPrice=discountFactory.create(type).getTotal(price);
            System.out.println("  :"+(price-discountPrice));
            System.out.println("  :"+discountPrice);
        }
    }
    public class Client {
        public static void main(String[] args) {
            Order order=new Order(620);
            order.display();
        }
    }
    
    실행 결과:
    在这里插入图片描述
    在这里插入图片描述
    이렇게 되면 단일 할인 이 든 여러 할인 이 든 클 라 이언 트 가 사용 할 때 하나의 용법 이 므 로 구분 하고 걱정 할 필요 가 없다.
    총결산
    이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!

    좋은 웹페이지 즐겨찾기