1. 개요
시스템에 객체에 대한 여러 상태가 있으면 상태가 그들 사이에서 변환 될 수 있으며 객체는 다른 상태에서 다르게 동작합니다. 상태 모드는 객체의 상태를 객체에서 분리하고이를 특수 상태 클래스로 캡슐화하여 객체 상태를 유연하게 변경할 수 있습니다. 상태 모드는 객체 행동 모드입니다.
2. 해당 시나리오
시스템에서 복잡한 물체의 다중 상태 전환의 캡슐화 문제를 해결하는 데 사용됩니다. 간단히 말해서, 그것은 여러 객체 상태와 상호 전환을 다루는 것입니다.
III. UML 클래스 다이어그램
4. 참가자
1), AbstractState (Abstract State Class) :
추상 주 클래스는 다른 상태에서 행동 초록 방법을 정의하며, 다른 행동 작전은 서브 클래스 (다른 상태 서브 클래스)로 구현됩니다.
2) Concretestate (특정 상태에서 행동을 구현하는 상태 하위 클래스) :
초록 상태 클래스의 서브 클래스, 각 서브 클래스는 환경 클래스 상태 (컨텍스트)의 상태와 관련된 동작을 구현합니다. 각 특정 상태 클래스는 환경의 특정 상태에 해당하며 특정 상태의 동작은 다릅니다.
3) 컨텍스트 (상태 개체를 소유 한 환경 클래스) :
환경의 다양성으로 인해 상태 속성이 있으면 상태가 다른 상태를 가질 수 있으며 다른 상태에서 다르게 행동 할 수 있습니다. 환경 클래스에서 추상적 인 상태 인스턴스를 유지하십시오. 이 인스턴스는 현재 환경의 상태 (setstate () 메소드)를 정의하고 특정 상태 동작을 분리하고 다른 상태 서브 클래스로 완료됩니다.
5. 사용 사례 학습
1. 초록 상태 클래스 : State.java
/ *** Java 디자인 패턴의 상태 모드* 초록 상태 클래스* @author [email protected]**/ public acbact class state {/ *** 상태 행동 추상 방법, 특정 상태 서브 클래스는 다른 행동 논리를 구현합니다*/ public achold void behavior (); }
2. 특정 상태 서브 클래스 A : Concretestatea.java
/ ** * 특정 상태 서브 클래스 a * @author [email protected] */ public class concretestatea는 state {@override public void behavior () {// 상태 A의 비즈니스 동작 및이 상태에있을 때 할 수있는 일을 확장합니다. 지불"); }}
3. 특정 상태 서브 클래스 B : Concretestateb.java
/ ** * 특정 상태 서브 클래스 b * @Author [email protected] * */ public class concretestateb는 state {@override public void behavior () {// 상태 B의 비즈니스 동작, 그리고이 상태에있을 때 할 수있는 일을 확장합니다. 전화 "); }}
4. 상태 객체가있는 환경 클래스 : context.java
/** * 환경/컨텍스트 클래스 <br/> * 상태 객체가 있으며 상태 간의 전환을 완료 할 수 있습니다. / * * 휴대 전화 전화 통화 수수료 속성 시뮬레이션 <br/> * 환경 상태는 다음과 같습니다. * 1>, 청구서> = 0.00 $ 일 때 : 상태가 정상 일 때도 여전히 전화를 걸 수 있습니다. /*** 환경 처리 함수, 상태 인스턴스 동작을 호출하는 비즈니스 논리를 완료합니다. state.behavior (); }/*** 환경 상태 확인 : 상태 변경/스위칭은 환경 클래스*/private void checkstate () {if (bill> = 0.00) {setstate (new Concretestatea ()); } else {setstate (new Concretestateb ()); }}/** * 환경 상태 설정 <br/> * 개인 방법, 목적은 환경 상태를 시스템 환경 자체에 의해 제어/전환하도록하는 것이며, 외부 사용자는 환경 내부의 상태를 신경 쓰지 않아도됩니다. } public double getBill () {return bill; } public void setBill (Double Bill) {this.bill = Bill; }} 5. 클라이언트 전화 클래스 테스트 : Client.java
공개 클래스 클라이언트 {public static void main (String [] args) {context context = new Context (); Context.SetBill (5.50); System.out.println ( "현재 전화 요금 잔액 :" + context.getBill () + "$"); context.handle (); Context.SetBill (-1.50); System.out.println ( "현재 전화 요금 잔액 :" + context.getBill () + "$"); context.handle (); Context.SetBill (50.00); System.out.println ( "현재 전화 요금 잔액 :" + context.getBill () + "$"); context.handle (); }} 6. 프로그램 작동 결과 :
현재 전화 요금 잔액 : 5.5 $
현재 전화 청구서 잔액은 계약금으로 인해 전화가 다운되지 않을 때 정상적으로 이루어질 수 있습니다. -1.5 $
전화가 서비스가 중단 될 때 현재 전화 요금 잔액은 전화를 걸 수 없습니다.
전화는 계약금없이 정상적으로 전화를 걸 수 있습니다.
VI. 확장하다
상태 모드에서 상태 전환의 두 가지 구현이 있습니다.
방법 1 : 상태의 변경/스위칭은 환경 클래스에서 구현됩니다. 위의 사용 사례 코드에서와 같이 컨텍스트 클래스의 CheckState () 메소드.
/*** 환경 상태 확인 : 상태 변경/스위칭은 환경 클래스에서 구현됩니다*/private void CheckState () {if (bill> = 0.00) {setstate (new Concretestatea ()); } else {setstate (new Concretestateb ()); }} 방법 2 : 상태의 변경/스위칭은 특정 상태 서브 클래스에서 구현됩니다.
구현 단계는 다음과 같습니다.
1) 환경 클래스 컨텍스트 클래스에서 상태 인스턴스 개체를 초기화하고 환경 컨텍스트 객체를 서브 클래스 상태의 생성자 매개 변수로 특정 상태 서브 클래스 인스턴스로 전달합니다.
예를 들어, 문맥에서 Java 클래스
// 초기 상태를 설정하십시오.
2) 특정 서브 클래스 상태 클래스에서 구성된 컨텍스트 객체에 따라 비즈니스 로직은 컨텍스트 객체의 속성 값을 호출하여 상태를 판단합니다.
예를 들어, Concretestatea.java 클래스에서 특정 상태 하위 클래스 :
/ ** * 특정 상태 서브 클래스 a * @author [email protected] */ public class concretestatea State {private context ctx; Public Concretestatea (컨텍스트 컨텍스트) {ctx = 문맥; } @override public void zoving () {// 상태 A의 비즈니스 동작 및이 상태에있을 때 수행 할 수있는 일 // 예 : 휴대 전화는 계약금 시스템으로 인해 정상적으로 전화를 걸 수 없을 때 정상적으로 전화를 걸 수 있습니다. CheckState (); }/** * 상태를 변환 해야하는지 확인 <br/> * 상태의 전환은 특정 상태 서브 클래스 */private void checkstate () {if (ctx.getBill () <0.00) {ctx.setstate (new Concretestateb (ctx))에서 구현됩니다. }}}
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.