Spring 에서 디자인 모델 을 어떻게 사용 하 는 지 에 대해 논 하 다.
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 를 현재 인 스 턴 스 로 처리 하 는 것 을 볼 수 있 습 니 다.이런 종류의 디자인 에 대해 몇 가지 주의해 야 할 점 이 있다.위 에서 우 리 는 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
@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 으로 성명 할 수 있 습 니 다.이런 사용 방식 에 대해 본인 은 가 부 를 말 하지 않 지만 제 이해 에 있어 서 여기 에는 주로 두 가지 점 이 있 습 니 다.우 리 는 이해 해 야 합 니 다.
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 클래스 에 우리 가 필요 로 하 는 인 스 턴 스 를 주입 하여 일정한 업무 처 리 를 할 수 있 습 니 다.이 모델 에 대해 몇 가지 설명 이 필요 합 니 다.
@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 모델 을 어떻게 사용 하 는 지 에 대해 설명 하고 각 모델 을 실현 할 때 우리 가 주의해 야 할 점 을 강조 했다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.