자바 디자인 모드-조합 모드 상세 설명
조합 모드(Composite Pattern)는 일부 전체 모델 이 라 고도 부 르 는데 비슷 한 대상 을 하나의 대상 으로 하 는 데 사용 된다.조합 모델 은 나무 구조 에 따라 대상 을 조합 하여 부분 과 전체적인 차원 을 나타 낸다.이런 유형의 디자인 모델 은 구조 형 모델 로 대상 그룹의 트 리 구 조 를 만 들 었 다.
4.567917.주요 해결:이 는 우리 나무 구조의 문제 에서 간단 한 요소 와 복잡 한 요소 의 개념 을 모호 하 게 하고 고객 프로그램 은 간단 한 요 소 를 처리 하 는 것 처럼 복잡 한 요 소 를 처리 하여 고객 프로그램 과 복잡 한 요소 의 내부 구 조 를 결합 시 킬 수 있다4.567917.어떻게 해결 합 니까?나뭇가지 와 잎 은 통 일 된 인 터 페 이 스 를 실현 하고 나뭇가지 내부 에 이 인 터 페 이 스 를 조합 합 니 다언제 사용 합 니까?
1.대상 의 부분-전체 차원 구조(트 리 구조)를 표시 하고 싶 습 니 다.
2.사용자 가 조합 대상 과 하나의 대상 이 다 르 기 를 무시 하고 사용 자 는 조합 구조의 모든 대상 을 통일 적 으로 사용 하 기 를 바 랍 니 다.
4.567917.장면 사용:부분,전체 장면,예 를 들 어 트 리 메뉴,파일,폴 더 의 관리장점.
결점.
고 층 모듈 호출 이 간단 하고 노드 가 자 유 롭 게 증가 합 니 다.
잎 과 나뭇가지 의 성명 은 인터페이스 가 아 닌 실현 류 로 거꾸로 의존 하 는 원칙 을 위반 했다.
폴 더-파일 의 트 리 구 조 는 낯 설 지 않 을 것 입 니 다.파일 은 잎 노드(단일 대상)로 보고 폴 더 는 중간 노드(조합 대상)로 봅 니 다.
조합 모드 는 사용자 로 하여 금 하나의 대상 과 조합 대상 에 대한 방문 이 일치 성 을 가지 게 한다.즉,사용자 로 하여 금 일치 하 는 방식 으로 개별 대상 과 조합 대상 을 처리 하 게 한다.사용 과정 에서 구분 되 어 번 거 로 움 을 초래 하 는 것 을 피하 다.
먼저 일반적인 문법 을 살 펴 보 자.
사용자 가 하나의 할인 방안 만 만족 할 때 이런 방법 은 대응 할 수 있다.
그러나 알뜰 하 게 계산 하 는 우 리 는 여러 가지 할인 방안 을 동시에 만족 시 킬 수 있다.이때 조합 모델 로 이런 단일 할인 방안 을 조합 하여 수용 한 다음 에 할인 충돌 해결 전략 을 정의 할 수 있다.단일 대상 과 조합 대상 의 통일 을 실현 하여 호출 자가 사용 할 때 구분 하지 않도록 한다.
조합 대상 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();
}
}
실행 결과:이렇게 되면 단일 할인 이 든 여러 할인 이 든 클 라 이언 트 가 사용 할 때 하나의 용법 이 므 로 구분 하고 걱정 할 필요 가 없다.
총결산
이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.