Java 응용 프로그램에서 상태 및 정책 패턴을 올바르게 사용하려면 개발자는 두 패턴의 차이점을 명확하게 알아야합니다. 상태 모드와 정책 모드의 구조는 매우 유사하지만, 견고한 설계 원칙의 'O'를 나타내는 개방 및 폐쇄 원칙을 따릅니다. 그들의 의도는 완전히 다릅니다. Java의 정책 패턴은 관련 알고리즘 세트를 캡슐화하여 발신자에게 런타임 유연성을 제공하는 것입니다. 발신자는 정책을 사용하여 컨텍스트 클래스를 수정하지 않고 런타임에 다른 알고리즘을 선택할 수 있습니다. 정책 패턴 사용의 전형적인 예에는 암호화 알고리즘 구현, 압축 알고리즘 및 정렬 알고리즘이 포함됩니다. 반면, 상태 모드는 객체를 사용하여 다른 상태에서 다른 동작을 보여줍니다. 현실 세계의 물체에는 국가가 있으며 국가에 따라 다르게 행동 할 것입니다. 예를 들어, 자동 판매기는 Hascoin State에서만 품목을 판매 할 수 있습니다. 동전을 채우지 않으면 상품을 판매하지 않습니다. 이제 정책 모드와 상태 모드의 차이점을 명확하게 볼 수 있습니다. 목적이 다릅니다. 상태 모드는 객체가 상태를 관리하는 데 도움이되는 반면 정책 모드를 사용하면 클라이언트가 다른 동작을 선택할 수 있습니다. 보기 쉽지 않은 또 다른 차이점은 누가 행동 변화를 유발하는 사람입니다. 정책 모드에서는 클라이언트 중심으로 컨텍스트 정보에 대한 다양한 정책을 제공합니다. 상태 모드에서 상태 이동은 컨텍스트 또는 상태 객체 자체에 의해 관리됩니다. 마찬가지로, 상태 객체에서 상태를 수정하면 컨텍스트에 대한 참조를 보유해야합니다. 즉, 자동 판매기의 경우 SetState 메소드를 호출하여 현재 컨텍스트 상태를 수정할 수 있습니다. 반면에 정책 개체는 컨텍스트에 대한 참조를 보유하지 않으며 클라이언트는 선택된 정책을 컨텍스트로 전달합니다. 전략 및 상태 패턴은 Java 디자인 패턴에 대한 가장 쉬운 인터뷰 질문입니다. Java 디자인 패턴에 대한이 기사에서는이를 자세히 소개합니다. 우리는 두 모드의 유사점과 차이점을 탐색하여 두 모드에 대한 이해를 향상시키는 데 도움이됩니다.
상태 모드와 정책 모드의 유사성 :
정책 패턴과 상태 패턴의 UML 그래프를 보면 매우 유사하게 보입니다. 상태 모드에서는 상태 객체를 사용하여 동작을 변경하는 객체를 컨텍스트 객체라고합니다. 마찬가지로 전략 모드에서 전략 객체를 사용하여 동작을 변경하는 객체도 컨텍스트 객체입니다. 클라이언트는 컨텍스트 객체와 상호 작용합니다. 상태 모드에서 컨텍스트는 상태 객체의 메소드 호출을 동조합니다. 컨텍스트의 현재 객체는 특정 상태 객체입니다. 정책 모드에서 컨텍스트는 정책 개체도 작동합니다. 이 객체는 매개 변수로 전달되거나 컨텍스트 객체를 만들 때 제공됩니다.
이 두 핵심 Java 디자인 패턴 사이의 유사점을 살펴 보겠습니다.
상태 모드와 정책 모드는 모두 새로운 상태 또는 정책을 사용하지 않고 쉽게 추가하기가 쉽습니다. 둘 다 개방 및 폐쇄의 설계 원칙을 따릅니다. 즉, 디자인은 확장에 개방되어 있으며 수정으로 폐쇄됩니다. 이 두 모드에서 컨텍스트는 수정을 위해 닫히고 새로운 상태 또는 정책을 추가합니다. 다른 상태에서 컨텍스트 객체를 수정할 필요가 없거나 작은 변경 만 필요합니다. 상태 모드의 컨텍스트 객체에 초기 상태가있는 것처럼 정책 모드의 컨텍스트에는 일반적으로 기본 정책도 있습니다.
상태 모드는 다른 상태 객체를 방해하는 방식으로 다른 동작을 캡슐화하는 반면 정책 모드는 다른 정책 개체를 방해하는 다른 동작을 캡슐화합니다.
두 패턴 모두 특정 서브 클래스에 의존하여 특정 동작을 달성합니다. 각 특정 정책은 추상 정책 클래스에서 확장되며 각 상태는 또한 초록 클래스의 상태 또는 하위 클래스를 나타내는 데 사용되는 인터페이스입니다.
상태 모드 인스턴스
공개 클래스 창시 상태 {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 ( "wind this.stateValue = "전체 화면"; } else if ( "fullScreen".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 (); }} /** 상태 (상태) 모드 동작 모드* 대상의 상태와 객체의 상태를 변경하고 상태에 따라 상태에 따라 행동*/ public class test {public static void main (String [] args) {/** 상태에 의해 제어되는 두 개의 상태 값 만 있습니다. WindowState ( "Window")); context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); }}인쇄
창 상태로 전체 화면 상태로 전환하여 창 상태에서 전체 화면 상태로 전환
정책 모드 예제
/ *** 제품 프로모션*이 범주는 다음과 같습니다. 현금 컬렉션*/ 공개 인터페이스 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 구현 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 * */ 공공 클래스 Cashreturn을 구현합니다. // 캐쉬백 최소 금액 Private Double ReturnMoney; // 반환 금액 공개 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 {반품 돈; }}} / *** 통과 된 정책 클래스*/ Public Class CashContext {private icashsuper Casher; public cashcontext () {} public cashcontext (icashsuper casher) {this.casher = Casher; } public void setcasher (icashsuper Casher) {this.casher = Casher; } // 특정 정책 객체에 따라 공개 Double AcceptCash (Double Money)를 호출하는 알고리즘 동작 {return this.casher.acceptcash (Money); }} 공개 클래스 테스트 {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)); // Cashback Strategy 50 이상 300}}}인쇄
원래 가격 : 998.0 85% 꺼짐 : 848.3 50 : 848.0 이상 300에 대한 리베이트
정책 모드와 상태 모드의 차이
우리는 두 패턴이 구조에서 매우 유사하다는 것을 배웠지 만 여전히 다른 부분이 있습니다. 그들 사이의 주요 차이점을 살펴 보겠습니다.
이것이 Java의 정책 패턴과 상태 패턴의 모든 차이점입니다. 내가 말했듯이, 그것들은 UML 다이어그램에서 매우 비슷해 보이며, 둘 다 개방 및 폐쇄 및 캡슐화 행동의 원리를 따릅니다. 정책 모드는 알고리즘이나 정책을 캡슐화하는 데 사용됩니다. 런타임시 매개 변수 또는 조합 객체로 컨텍스트 객체에 제공되는 반면 상태 모드는 상태 마이그레이션을 관리하는 데 사용됩니다.