Java 디자인 모드 프로그래밍에서의 상태 모드와 정책 모드 비교
상태 모드와 정책 모드의 유사점:
정책 모드와 상태 모드의 UML 그림을 보면 매우 비슷해 보입니다.상태 모드에서 State 대상을 사용하여 행동을 바꾸는 대상을 Context 대상이라고 하는데, 유사한 정책 모드에서 Strategy 대상을 사용하여 행동을 바꾸는 대상도 Context 대상이다.클라이언트는 Context 대상과 상호작용한다는 것을 명심하세요.상태 모드에서 Context는 상태 대상의 방법 호출을 에이전트합니다. Context의 현재 대상은 구체적인 상태 대상입니다. 정책 모드에서 Context가 조작하는 것도 정책 대상입니다. 이 대상은 매개 변수로 들어오거나 Context 대상을 만들 때 제공됩니다.
이 두 가지 핵심 Java 디자인 모델의 유사점을 살펴보겠습니다.
상태 모드와 정책 모드는 Context 대상을 사용하는 데 영향을 주지 않고 새로운 상태나 정책을 추가하기 쉽다
두 가지 모델 모두 개폐의 디자인 원칙을 따른다. 즉, 당신의 디자인은 확장 개방에 대한 것이고 수정에 대한 폐쇄에 대한 것이다.이 두 가지 모델에서 Context는 수정에 대해 폐쇄적이다. 상태나 정책을 추가한다. 다른 상태의 Context 대상을 수정할 필요가 없거나 아주 작은 변경만 하면 된다.
상태 모드에서 Context 대상에 초기 상태가 있는 것처럼 정책 모드의 Context에도 기본 정책이 있습니다.
상태 모드는 서로 다른 상태 대상의 방식으로 서로 다른 행위를 봉하고, 정책 모드는 서로 다른 정책 대상으로 서로 다른 행위를 봉한다.
이 두 가지 모델은 모두 구체적인 자류에 의존하여 구체적인 행위를 실현한다.모든 구체적인 전략은 하나의 추상적인 전략 클래스에서 확장되고 모든 상태는 상태를 나타내는 인터페이스나 추상적인 클래스의 하위 클래스로도 사용된다.
상태 모드 인스턴스
public class WindowState {
private String stateValue;
public WindowState(String stateValue) {
this.stateValue = stateValue;
}
public String getStateValue() {
return stateValue;
}
public void setStateValue(String stateValue) {
this.stateValue = stateValue;
}
public void handle() {
/*
* ,
*/
if (" ".equals(stateValue)) {
switchWindow();
this.stateValue = " ";
} else if (" ".equals(stateValue)) {
switchFullscreen();
this.stateValue = " ";
}
}
private void switchWindow() {
System.out.println(" ");
}
private void switchFullscreen() {
System.out.println(" ");
}
}
/**
*
*/
public class WindowContext {
private WindowState state;
public WindowContext(WindowState state) {
this.state = state;
}
public WindowState getState() {
return state;
}
public void setState(WindowState state) {
this.state = state;
}
public void switchState() {
this.state.handle();
}
}
/*
* (State)
* ,
* ,
*/
public class Test {
public static void main(String[] args) {
/*
* ,
* ,
*/
WindowContext context = new WindowContext(new WindowState(" "));
context.switchState();
context.switchState();
context.switchState();
context.switchState();
}
}
인쇄
정책 모드 인스턴스
/**
*
* :
*/
public interface ICashSuper {
double acceptCash(double money);
}
/**
*
* @author stone
*
*/
public class CashNormal implements ICashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
/**
*
* @author stone
*
*/
public class CashRebate implements ICashSuper {
private double rebate; //
public CashRebate (double rebate) {
this.rebate = rebate;
}
@Override
public double acceptCash(double money) {
return new BigDecimal(money * rebate / 10).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
/**
*
* @author stone
*
*/
public class CashReturn implements ICashSuper {
private double moneyCondition; //
private double returnMoney; //
public CashReturn(double moneyCondition, double returnMoney) {
this.moneyCondition = moneyCondition;
this.returnMoney = returnMoney;
}
@Override
public double acceptCash(double money) {//
if (money >= moneyCondition) {
return money - Math.floor(money / moneyCondition) * returnMoney;
} else {
return money;
}
}
}
/**
* ,
*/
public class CashContext {
private ICashSuper casher;
public CashContext() {
}
public CashContext(ICashSuper casher) {
this.casher = casher;
}
public void setCasher(ICashSuper casher) {
this.casher = casher;
}
// ,
public double acceptCash(double money) {
return this.casher.acceptCash(money);
}
}
public class Test {
public static void main(String[] args) {
double money = 998; //
CashContext cashContext = new CashContext(new CashNormal());
System.out.println(" :" + cashContext.acceptCash(money)); //
cashContext.setCasher(new CashRebate(8.5));
System.out.println(" 85 :" + cashContext.acceptCash(money)); // 85
cashContext.setCasher(new CashReturn(300, 50));
System.out.println(" 300 50:" + cashContext.acceptCash(money)); // 300 50
}
}
인쇄
:998.0
85 :848.3
300 50:848.0
정책 모드와 상태 모드의 차이우리는 이미 이 두 모델이 구조적으로 매우 비슷하다는 것을 알았지만, 그것들은 여전히 다른 점이 있다.다음은 그들 사이의 관건적인 차이점을 살펴보자.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.