Spring 에서 디자인 모델 을 어떻게 사용 하 는 지 에 대해 논 하 다.

10621 단어 Spring디자인 모드
디자인 모델 에 대해 적절하게 사용 하면 우리 의 코드 를 더욱 간결 하고 확장 할 수 있 습 니 다.본 고 는 주로 Spring 에서 전략 모델,공장 방법 모델 과 Builder 모델 을 어떻게 사용 하 는 지 설명 한다.
1.정책 모드
전략 모델 의 사용 방식 에 대해 Spring 에 서 는 비교적 간단 하 다.본질 적 으로 전략 모델 은 하나의 인터페이스 에서 여러 개의 실현 유형 이 있 고 모든 실현 유형 은 특정한 상황 을 처리 할 것 이다.우 리 는 보상 을 주 는 것 을 예 로 들 어 설명 을 한다.예 를 들 어 우 리 는 추첨 시스템 에서 포인트,가상 화폐 와 현금 등 여러 가지 보상 방식 을 선택 할 수 있다.저장 할 때 우 리 는 type 과 유사 한 필드 를 사용 하여 이 몇 가지 보상 을 표징 할 것 입 니 다.그러면 여기 서 우 리 는 다 중 방식 으로 보상 을 지급 할 수 있 습 니 다.예 를 들 어 우 리 는 PrizeSender 의 인 터 페 이 스 를 추상 화 했 는데 그 성명 은 다음 과 같다.

public interface PrizeSender {

 /**
  *                    
  */
 boolean support(SendPrizeRequest request);

 /**
  *     
  */
 void sendPrize(SendPrizeRequest request);

}

이 인터페이스 에는 주로 두 가지 방법 이 있 는데 그것 이 바로 슈퍼 port()와 sendPrize()이다.그 중에서 슈퍼 port()방법 은 각 하위 클래스 가 현재 유형의 데이터 처 리 를 지원 하 는 지 판단 하 는 데 사용 되 고,sendPrize()는 구체 적 인 업무 처 리 를 하 는 데 사용 된다.예 를 들 어 이 보상의 발급 이다.다음은 우리 세 가지 서로 다른 유형의 보상 이 지급 하 는 구체 적 인 코드 입 니 다.

//     
@Component
public class PointSender implements PrizeSender {

 @Override
 public boolean support(SendPrizeRequest request) {
  return request.getPrizeType() == PrizeTypeEnum.POINT;
 }

 @Override
 public void sendPrize(SendPrizeRequest request) {
  System.out.println("    ");
 }
}


//      
@Component
public class VirtualCurrencySender implements PrizeSender {

 @Override
 public boolean support(SendPrizeRequest request) {
  return PrizeTypeEnum.VIRTUAL_CURRENCY == request.getPrizeType();
 }

 @Override
 public void sendPrize(SendPrizeRequest request) {
  System.out.println("     ");
 }
}

//     
@Component
public class CashSender implements PrizeSender {

 @Override
 public boolean support(SendPrizeRequest request) {
  return PrizeTypeEnum.CASH == request.getPrizeType();
 }

 @Override
 public void sendPrize(SendPrizeRequest request) {
  System.out.println("    ");
 }
}
모든 피 드 형식 에서 우 리 는 슈퍼 port()방법 에서 request 의 특정한 매개 변 수 를 통 해 현재 request 가 현재 인 스 턴 스 로 처리 할 수 있 는 유형 인지,만약 그렇다면 외층 의 제어 논 리 는 request 를 현재 인 스 턴 스 로 처리 하 는 것 을 볼 수 있 습 니 다.이런 종류의 디자인 에 대해 몇 가지 주의해 야 할 점 이 있다.
  • @Component 주 해 를 사용 하여 현재 클래스 를 표시 하고 Spring 용기 가 관리 하 는 bean 으로 설명 합 니 다
  • boolean 값 을 되 돌려 주 는 support()와 유사 한 방법 을 설명 합 니 다.이 방법 을 통 해 현재 인 스 턴 스 가 목표 request 를 처리 하 는 인 스 턴 스 인지 여 부 를 제어 합 니 다
  • 4.567917.sendPrize()와 유사 한 방법 으로 업무 논 리 를 처리 하 는 데 사 용 됩 니 다.물론 각 업무 의 서로 다른 성명 방법 명 에 따라 다 를 것 입 니 다.여 기 는 통 일 된 업무 처리 에 대한 추상 일 뿐 입 니 다
  • support()방법 이 든 sendPrize()방법 이 든 모두 하나의 대상 을 전송 하여 진행 해 야 합 니 다.간단 한 기본 유형의 변수 가 아 닙 니 다.이렇게 하 는 장점 은 추 후 Request 에 필드 를 추가 하려 면 인터페이스의 정의 와 이미 실 현 된 각 하위 클래스 의 논 리 를 수정 할 필요 가 없습니다
  • 2.공장 방법 모델
    위 에서 우 리 는 Spring 을 사용 하여 하나의 전략 모델 을 설명 하 는 방법 을 설명 했다.그러면 어떻게 서로 다른 업무 논리 에 서로 다른 bean 을 주입 하 는 지,아니면 외부 통제 논리 가 어떤 지,여기 서 우 리 는 공장 방법 모델 을 사용 할 수 있다.공장 방법 모델 이란 공장 방법 을 정의 하고 들 어 오 는 매개 변 수 를 통 해 특정한 인 스 턴 스 로 돌아 간 다음 에 이 인 스 턴 스 를 통 해 후속 적 인 업무 논 리 를 처리 하 는 것 이다.일반적으로 공장 방법의 반환 값 유형 은 인터페이스 유형 이 고 구체 적 인 하위 인 스 턴 스 를 선택 하 는 논 리 는 공장 방법 에 봉인 되 어 있다.이런 방식 을 통 해 외부 호출 논리 와 구체 적 인 하위 클래스 의 획득 논 리 를 분리 한다.다음 그림 에서 공장 방법 모델 의 설명도 를 보 여 주 었 다.

    이 를 통 해 알 수 있 듯 이 공장 방법 은 구체 적 인 사례 의 선택 을 봉인 했다.클 라 이언 트,즉 우리 의 호출 자 는 공장 의 구체 적 인 방법 으로 구체 적 인 사례 를 얻 으 면 되 고 구체 적 인 사례 의 실현 이 무엇 인지 상관 하지 않 아 도 된다.위 에서 우 리 는 Spring 에서 전략 모델 성명 처리 논 리 를 어떻게 사용 하 는 지 설명 하 였 으 며,구체 적 인 전략 을 어떻게 선택 하 는 지 설명 하지 않 았 으 며,여기에서 우 리 는 공장 방법 모델 을 사용 할 수 있다.다음은 우리 가 성명 한 PrizeSender Factory 입 니 다.
    
    @Component
    public class PrizeSenderFactory {
    
     @Autowired
     private List<PrizeSender> prizeSenders;
    
     public PrizeSender getPrizeSender(SendPrizeRequest request) {
      for (PrizeSender prizeSender : prizeSenders) {
       if (prizeSender.support(request)) {
        return prizeSender;
       }
      }
    
      throw new UnsupportedOperationException("unsupported request: " + request);
     }
    }
    
    
    여기 서 우 리 는 하나의 공장 방법 getPrizeSender()를 발 표 했 습 니 다.그 가입 은 Send PrizeRequest 이 고 반환 값 은 PrizeSender 인 터 페 이 스 를 실현 한 인 스 턴 스 입 니 다.이러한 방식 을 통 해 우 리 는 구체 적 인 선택 방식 을 구체 적 인 하위 클래스 로 내 려 갔 습 니 다.현재 PrizeSender 의 bean 이 현재 request 처 리 를 지원 하 는 지 여 부 를 알 수 있 습 니 다.구체 적 인 하위 클래스 에서 이 루어 진 것 이다.이 공장 방법 에서 우 리 는 구체 적 인 하위 클래스 와 관련 된 어떠한 논리 도 없다.즉,이 클래스 는 실제 적 으로 새로 추 가 된 하위 클래스 의 실례 를 동적 으로 검 측 할 수 있다.이것 은 주로 Spring 의 자동 주입 을 통 해 이 루어 진 것 이다.주로 우리 가 여기에 주입 한 것 은 List이기 때문이다.즉,새로운 PrizeSender 의 하위 인 스 턴 스 가 있 으 면 Spring 이 관리 하 는 것 이 라면 모두 여기에 주입 된다 는 것 이다.다음은 우리 가 작성 한 테스트 에 사용 할 코드 로 호출 자의 호출 을 모 의 하 는 것 입 니 다.
    
    @Service
    public class ApplicationService {
    
     @Autowired
     private PrizeSenderFactory prizeSenderFactory;
    
     public void mockedClient() {
      SendPrizeRequest request = new SendPrizeRequest();
      request.setPrizeType(PrizeTypeEnum.POINT); //    request                 
      PrizeSender prizeSender = prizeSenderFactory.getPrizeSender(request);
      prizeSender.sendPrize(request);
     }
    }
    
    
    클 라 이언 트 코드 에서 먼저 PrizeSenderFactory 를 통 해 PrizeSender 인 스 턴 스 를 얻 은 다음 에 sendPrize()방법 으로 구체 적 인 보상 을 지급 합 니 다.이런 방식 으로 구체 적 인 보상 발급 논리 와 클 라 이언 트 호출 을 결합 시 켰 습 니 다.그리고 앞의 설명 에 따 르 면,우 리 는 보상 방식 이 추가 되 었 다 면,우 리 는 PrizeSender 의 bean 을 새로운 것 으로 만 설명 하면 되 며,기 존 코드 에 대해 어떠한 수정 도 할 필요 가 없다 는 것 을 알 고 있 습 니 다.
    3.빌 더 모드
    Builder 모드 에 대해 저 는 lombok 을 사용 한 적 이 있 는 친구 들 이 builder 모드 가 매우 간단 하 다 고 말 할 것 입 니 다.특정한 bean 에서@Builder 주 해 를 사용 하여 성명 을 하면 됩 니 다.lombok 은 자동 으로 Builder 의 bean 으로 성명 할 수 있 습 니 다.이런 사용 방식 에 대해 본인 은 가 부 를 말 하지 않 지만 제 이해 에 있어 서 여기 에는 주로 두 가지 점 이 있 습 니 다.우 리 는 이해 해 야 합 니 다.
  • Builder 모델 은 그 이름 에 있어 구축 자 입 니 다.저 는 이 를 일정한 매개 변 수 를 통 해 특정한 업무 논 리 를 통 해 특정한 대상 을 만 드 는 경향 이 있 습 니 다.만약 에 lombok 만 사용 하 는 방식 이 라면 본질 적 으로 간단 한 bean 을 만 들 었 습 니 다.이것 은 getter 와 setter 방식 으로 bean 을 구축 하 는 것 과 큰 차이 가 없습니다
  • Spring 프레임 워 크 에서 디자인 모델 을 사용 하 는 가장 큰 문 제 는 각 모델 bean 에 Spring 의 bean 을 주입 할 수 있다 면 주입 할 수 있다 면 사용 방식 을 크게 확대 하 는 것 이다.우 리 는 들 어 오 는 간단 한 몇 개의 매개 변 수 를 통 해 Spring 이 주입 한 bean 과 결합 하여 일정한 처 리 를 한 후에 우리 가 필요 로 하 는 특정한 bean 을 구성 할 수 있 기 때문이다.분명히 이것 은 lombok 이 실현 할 수 없 는 것 이다
  • Builder 모드 에 대해 서 는 앞의 보상 으로 발 급 된 Send PrizeRequest 의 구 조 를 예 로 들 어 설명 할 수 있 습 니 다.request 대상 을 구성 할 때 반드시 프론트 데스크 톱 에서 전달 하 는 일부 매개 변 수 를 통 해 일정한 처 리 를 거 쳐 마지막 으로 request 대상 을 생 성 합 니 다.그러면 우 리 는 Builder 모드 를 사용 하여 Send PrizeRequest 를 구축 할 수 있 습 니 다.프론트 데스크 톱 호출 에 따라 prizeId 와 userId 를 얻 을 수 있다 고 가정 하면 다음 과 같은 Send PrizeRequest 를 만 들 수 있 습 니 다.
    
    public class SendPrizeRequest {
    
     private final PrizeTypeEnum prizeType;
     private final int amount;
     private final String userId;
    
     public SendPrizeRequest(PrizeTypeEnum prizeType, int amount, String userId) {
      this.prizeType = prizeType;
      this.amount = amount;
      this.userId = userId;
     }
    
     @Component
     @Scope("prototype")
     public static class Builder {
    
      @Autowired
      PrizeService prizeService;
    
      private int prizeId;
      private String userId;
    
      public Builder prizeId(int prizeId) {
       this.prizeId = prizeId;
       return this;
      }
    
      public Builder userId(String userId) {
       this.userId = userId;
       return this;
      }
    
      public SendPrizeRequest build() {
       Prize prize = prizeService.findById(prizeId);
       return new SendPrizeRequest(prize.getPrizeType(), prize.getAmount(), userId);
      }
     }
    
     public PrizeTypeEnum getPrizeType() {
      return prizeType;
     }
    
     public int getAmount() {
      return amount;
     }
    
     public String getUserId() {
      return userId;
     }
    }
    
    
    여 기 는 Spring 을 사용 하여 Builder 모드 를 유지 하 는 예제 입 니 다.구체 적 인 유지 방식 은 Builder 클래스 에@Component 와@Scope 주 해 를 사용 하여 이 Builder 클래스 를 표시 하 는 것 입 니 다.그러면 우 리 는 Builder 클래스 에 우리 가 필요 로 하 는 인 스 턴 스 를 주입 하여 일정한 업무 처 리 를 할 수 있 습 니 다.이 모델 에 대해 몇 가지 설명 이 필요 합 니 다.
  • Builder 클래스 에 서 는@Scope 주 해 를 사용 하여 이 인 스 턴 스 를 prototype 형식 으로 표시 해 야 합 니 다.분명 하기 때문에 우리 가 있 는 Builder 인 스 턴 스 는 상태 가 있어 서 다 중 스 레 드 에 공유 할 수 없습니다
  • Builder.build()방법 에서 우 리 는 들 어 오 는 매개 변수 와 주 입 된 bean 을 통 해 일정한 업무 처 리 를 하여 Send PrizeRequest 를 구축 하 는 데 필요 한 인 자 를 얻 을 수 있 습 니 다
  • Builder 류 는 static 수식 을 사용 해 야 합 니 다.자바 에서 내부 클래스 가 static 수식 을 사용 하지 않 으 면 이러한 인 스 턴 스 는 외부 클래스 의 인 스 턴 스 에 의존 해 야 합 니 다.우 리 는 본질 적 으로 내부 클래스 인 스 턴 스 를 통 해 외부 클래스 인 스 턴 스 를 구축 하고 자 합 니 다.즉,내부 클래스 인 스 턴 스 가 존재 할 때 외부 클래스 인 스 턴 스 는 존재 하지 않 습 니 다.따라서 여 기 는 static 수식 을 사용 해 야 합 니 다
  • 4.567917.표준 Builder 모드 의 사용 방식 에 따라 외부 클래스 의 각 매개 변 수 는 final 수식 을 사용 한 다음 에 getter 방법 을 설명 하면 됩 니 다위 에서 우 리 는 Spring 방식 을 사용 하여 Builder 모드 의 종 류 를 설명 하 는 방법 을 보 여 주 었 습 니 다.그러면 우 리 는 어떻게 사용 해 야 합 니까?다음은 우리 의 사용 예 입 니 다.
    
    @Service
    public class ApplicationService {
    
     @Autowired
     private PrizeSenderFactory prizeSenderFactory;
    
     @Autowired
     private ApplicationContext context;
    
     public void mockedClient() {
      SendPrizeRequest request = newPrizeSendRequestBuilder()
        .prizeId(1)
        .userId("u4352234")
        .build();
    
      PrizeSender prizeSender = prizeSenderFactory.getPrizeSender(request);
      prizeSender.sendPrize(request);
     }
    
     public Builder newPrizeSendRequestBuilder() {
      return context.getBean(Builder.class);
     }
    }
    
    
    상기 코드 에서 우 리 는 주로 new PrizeSend RequestBuilder()방법 을 살 펴 봐 야 합 니 다.Spring 에서 한 가지 유형 이 여러 가지 유형 이 라면@Scope(prototype)로 표 시 를 했 습 니 다.그러면 이 bean 을 얻 을 때마다 applicationContext.getBean()방법 으로 새로운 인 스 턴 스 를 얻어 야 합 니 다.구체 적 인 원인 에 대해 서 는 독자 가 관련 문 서 를 찾 아 볼 수 있 습 니 다.저 희 는 단독 적 인 방법 으로 Builder 대상 을 만 든 다음 에 스 트림 을 통 해 prizeId 와 userId 등 인 자 를 설정 하고 마지막 으로 build()방법 으로 Send PrizeRequest 인 스 턴 스 를 구축 하여 이 인 스 턴 스 를 통 해 후속 적 인 보상 을 보 냅 니 다.
    4.소결
    본 고 는 주로 장려 발급 의 예 시 를 통 해 Spring 에서 공장 방법 모델,전략 모델 과 Builder 모델 을 어떻게 사용 하 는 지 에 대해 설명 하고 각 모델 을 실현 할 때 우리 가 주의해 야 할 점 을 강조 했다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기