디자인 패턴 전략 모드 및 상태 모드 (전략 패턴 및 상태 패턴)

전략 모드 및 상태 모드 :이 논문은 유사한 디자인 패턴의 동작을 설명하기 위해 두 구조를 비교합니다. 둘 다 개인의 이해와 학습은 상대적으로 직관적이고 간단하지만 그것의 실제 사용은 좋은 연습, 그것을 배우는 디자인 패턴을 사용하기 어려울 수 없습니다. 이것은 예 및 비교 설명을 통해, 나는 그것이 더 깊은 인식의 일부를해야한다 생각에 함께 또한 모두의 도입에 대한 이유입니다. 마지막으로, 개인적인 경험의 조합은 단순히이 두 모드의 의견 중 일부에 대해 이야기.

1. 개념 모델

1.1 전략 패턴

런타임 동작 또는 알고리즘 변경 등, 그 기능을 변경하는 목적을 달성하기 위하여;

사용 시나리오 :  시스템이 동적으로 여러 알고리즘 중 하나를 선택해야하지만 이러한 알고리즘은 자신의 행동 사이에만 다릅니다. 또한 너무 많은 의사 결정 과정이 다른 경우, 당신은이 모드를 사용하여 고려할 수 있습니다 발생합니다.

구현 : 이러한 알고리즘은, 예컨대 별도의 동작으로서 패키징 될 수 원하는 사용자에 의해 교체 될 수있다.

장점 :  더 유연하고 확장, 그리고 만약 다른 구조를 많이 피하십시오.

단점 :  외국 과도한 행동 정책 클래스 확장의 결과로, 모든 행동과 알고리즘의 클래스를 노출.

1.2 상태 모드

상태 결정에 의해 런타임 클래스 동작;

사용 시나리오 :  객체에 의존 충전 동작은 상태 변화 시나리오에 따라 변경, 또는 다른 경우 지점 구조와 같은 많은 수의;

구현 : 단일 패키지로 객체 클래스의 상태는 트랜잭션 상태의 각 상태를 처리하고, 다른 상태로의 상태 천이를 제어하는 단계;

장점 :  다른 큰 구조를 피하면 새로운 상태, 상태 전이 규칙 패키지를 쉽게 추가 할 각 상태는 다중화와 공유 할 수있다.

단점 :  모델 구조 및 상태에서의 과도한 증가에 오브젝트 및 클래스의 수를 결과적으로 비교적 복잡 달성한다. 각 상태에 더하여 새로운 상태에 의해 제어되는 다른 상태로 반송로 인해 동시에 상태 기계에 적용하는 상태의 기존 부분을 합류하도록 수정되어야한다.

1.3 유사성

동작 및 상태 모두 작은 구성 요소의 여분의 기능 일련의 조건들로 분할하고, 지역별되도록 개폐 쉽게 확장의 원리에 부합한다. 또한 가능한 경우 또는 다른 대안 지점 int로서, 최대 지원 행동과 상태가 제한됩니다;

1.4 차이

  • 전략 모드, 클래스의 기능은 현재의 상황에 따라 변경 주도권을 쥐고 것입니다;
  • 상태 모드는 수동적 기능 클래스는 현재의 상태에 의해 변화되고
  • 각 작업 또는 정책 모드 알고리즘 사이에 어떤 연관이 없습니다;
  • 상태 모드 상태의 상태와 그 자체의 상태 천이 제어 사이 협회;

2. 원리

두 가지 모드, 다음과 같은 두 가지 디자인 패턴에서 각각도 UML 클래스 모양의 구조와 매우 유사합니다 :

전략 모드 UML 2.1

설명 :

문맥:

전략의 어떤 종류를 사용하여, 자신의 행동에 의해 특정 정책 결정이 포함 된 클래스는 자신의 동작을 변경하기 위해 사용하는 정책을 수정하기 위해 이니셔티브를 취할 수 있습니다;

계략:

지원되는 모든 알고리즘을위한 공통 인터페이스를 정의하는 추상 전략 클래스;

ConcreteStrategy :

상황에 맞는 구체적인 전략을 사용할 수 있습니다;

UML 2.2 상태 모드

설명 :

문맥:

현재 상태의 동작을 결정하는 상태 플래그 클래스와, 상기 상태 천이 클래스 상태에 의해 제어되고;

상태:

모든 공용 인터페이스 컨텍스트의 상태를 정의하는 추상 상태 클래스;

ConcreteState :

일부 컨텍스트 클래스, 트랜잭션 처리를 포함하여 그 방법이 상태에서 상태 천이를 제어하는 ​​특정 상태;

3. 예 - 전략 패턴

예를 압축 소프트웨어는 다른 압축 전략을 사용합니다.

 

추상 전략 인터페이스 : 압축

공중  인터페이스 압축 {
     공개  공극 doCompression (); 
}

빠른 압축 알고리즘 : 빠른

공공  클래스 신속한는 구현 압축 { 
    @Override 
    공공  무효 doCompression () { 
        에서 System.out.println ( "사용 빠른 압축 전략을!" ); 
    } 
}

효율적인 압축 알고리즘 : 효율적인

공공  클래스 효율적인 구현의 압축 { 
    @Override 
    공공  무효 doCompression () { 
        에서 System.out.println ( "를 사용하여 효율적인 압축 전략!" ); 
    } 
}

암호화 압축 알고리즘 : 암호화

공공  클래스 암호화가 구현 압축 { 
    @Override 
    공공  무효 doCompression () {
         // TODO 자동 생성 방법 스텁 
        에서 System.out.println ( "를 사용하여 암호화 압축 전략을!" ); 
    } 
}

압축 알고리즘 소프트웨어 위에 통합 : WinRAR과

공공  클래스 WinRAR과 { 
    
    개인 압축 압축 = 널 (null) ; 
    
    공개 WinRar를 (압축 압축) {
          .compression = 압축; 
    } 
    
    공공  공극 setStrategy (압축 압축) {
          .compression = 압축; 
    } 
    
    공공  공극 압축 () {
         경우 (압축 =! ) { 
            compression.doCompression (); 
        } 
    } 
}

데모 :

공용  클래스 데모 {
     공공  정적  무효 메인 (문자열 []에 args) { 
        WinRar를 WinRar를 = 새로운 WinRar를 ( 새로운 고속 ()); 
        winrar.compression (); 
        winrar.setStrategy ( 효율적인 ()); 
        winrar.compression (); 
        winrar.setStrategy ( 암호화 ()); 
        winrar.compression (); 
    } 
}

결과 :

빠른 압축 전략을 사용! 
효율적인 압축 전략을 사용 ! 
암호화 압축 전략을 사용 !

이 예는 매우 직관적 보이는, 후자는 약간의 분석과 개인 이해를 제공 할 것입니다.

4. 예 - 상태 모델

우리는 자동 세탁기의 작업 과정을 통해 상태를 설명하는 모델을 사용합니다.

단순화하기 위해, 우리는 고려할 것 [시작] -> [작업] -> [끝],이 세 가지 상태.

은 UML의 클래스 다이어그램에서 처음으로 모습을 다음 :

인터페이스의 추상 상태 : 주

공중  인터페이스 상태 {
     공개  공극 doJob (세척 세척); 
}

상태를 시작 : 시작

공개  수업 시작을 구현하는 국가 { 
    @Override 
    공공  무효 doJob (세탁 세제) { 
        에서 System.out.println이 ( "세탁 의류를 시작합니다!" ); 
        washing.setState ( 직장 ()); 
        () washing.request; 
    } 
}

작업 상태 : 일

공공  클래스 일은 구현 주 { 
    @Override 
    공공  무효 doJob (세척 세척) { 
        에서 System.out.println ( "이제 근무!" ); 
        washing.setState ( 종료 ()); 
        () washing.request; 
    } 
}

최종 상태 : 종료

공공  클래스구현 주 { 
    @Override 
    공공  무효 doJob (세척 세척) { 
        에서 System.out.println을 ( ! "모두 완료" ); 
        washing.setState ( ); 
    } 
}

세탁기 카테고리 : 세탁

공공  클래스 세탁 {
     개인 주 상태 = 널 (null) ; 
    
    공공  무효 setState를 (주 상태) {
          .STATE = 상태;
        경우 (상태 == null이 ) { 
            에서 System.out.println ( "현재 상태 :! 널 (null)" ); 
        } 
        다른 { 
            에서 System.out.println ( "현재 상태 :"+ . state.getClass () getName ()); 
        } 
    } 
    
    공개  무효 요청 () {
         경우 (상태! = null의 ) { 
            state.doJob (이러한 ); 
        } 
    } 
}

데모 :

공용  클래스 데모 {
     공공  정적  무효 메인 (문자열 []에 args) { 
        세척 세척 = 새로운 세탁기 (); 
        washing.setState ( 새로운 시작 ()); 
        () washing.request; 
    } 
}

결과 :

현재 상태 : state.Start 
시작 빨래를 ! 
현재 상태 : state.Work 
작업 지금 ! 
현재 상태 : state.End 
모두 완료 ! 
현재 상태 : 널 (null) !

세척 제공 사용자에 의해 사용되는 기본 인터페이스. 처음에, 사용자가 세척 구성 상태를 사용하고 세척에 명령을 보낼 수 있습니다, 이후 사용자가 직접 특정 과도를 처리 할 필요가 없다. 각 상태는 자동으로 실행이 끝날 때까지, 다음 상태로 제어를 전송합니다.

5. 요약

디자인 패턴 및 상태 패턴 (반드시 바로, 그냥 생각)의 일부 이해 개인 전략에 대해 이야기 :

5.1 전략 모드 :

가) 사용 빈도가 심각하게 소비 성능을 수 다른 경우

전략 모드 전환이 임의의 조건을 기준으로합니다 대신, 행동 클래스는 종종 어떤 모드에서 작동, 더 적합합니다.

예를 들어, APP 개발 프로세스는, 특정 기능 어쨌든 화면의 상태에 달려 있으므로 다른 수평 또는 수직 스크린은, 프로세스의 다음 단계는 현재의 화면의 각 프레임에서 판정 된 경우 사용해야?

분명히, 이것은 올바른 접근 방법은 두 가지 전략, 화면이 전환 될 때마다, 어떤 모드를 사용하기 위해 Active 컷으로 수평 및 수직 화면 분할로 거래를 심각하게 소비 성능 인 것;

b) 및 전략 패턴을 대신 사용할 수있는 다른 경우의 모든 지점

위의 예 압축 소프트웨어의 경우, 사용자가 패턴을 선택합니다, 다음 작업이 아무 문제가 없다.

우리가 어떤 사용자가하고자 입력 매개 변수, 어떤 모드를 알 수 없기 때문에 그러나 우리가 제공하는 경우 것은 서로 다른 압축 방법을 사용하여 매개 변수를 전달할 수 있습니다 압축 명령, 다른 경우에 사용하는 것이 필요하다.

C)에는 정책 전략 모드 없습니다

코어 전략 패턴 대신에 대응하는 작업을 수행 할 경우, 다른 조건의 판단을하는 상태를 전달들은 직접 사용되는 특정 조건 하에서 개별적으로 재사용 될 수있다 바퀴들의 개수에 일련의 동작들로 분할된다.

이러한 관점에서, 이름의 가치가없는 정책 모드, 그것은뿐만 아니라 현재의 조건에 따라 지능, 합리적인 의사 결정이지만, 또한 적극적인 전략 실행을 선택하는 사용자가 필요합니다. 이 장점을 가지고 있지만, 그것은 또한 더 어떤 전략이된다 없습니다.

실제 개발 과정, 우리 모두가 서로 모든 문제를 얻을 수있는 가장 좋은 하나의 인터페이스는, 호출하기 때문에, 내가 구현에 대한 상관 없어 사용하기 쉬운 인터페이스를 제공하려면, 난 단지 단순한 사용에 대해 완료,이 인터페이스를 신경 내 그것은 필요가있다.

근본적인 이유는 동시에 확장의 분할 구성 요소에 의해 발생하는 피할 수없는 문제, 집행 모델에 의한 정책 결정은 호출자에 진출하게됩니다 자사의 휴식 캡슐, 노출 콘크리트 전략에있다, 코드는 유연하고 확장 성 동시에 사용하기 불편 제공합니다.

전략 패턴이 경우 다른 의사 결정을 많이 방지하는 것이라면, 그 언어는 조건에 따라 해당 동작을 직접 선택하여 키 값은 각각 해시 테이블, 상태 및 기능 개체를 사용하여 지원한다. 많은 수의 분지에 특히 적합합니다.

따라서, 실제 개발 과정은 실제 상황에 따라 무게해야합니다.

5.1 전략 모드 :

동작 클래스는 외부 사용자에게 친숙한 인터페이스를 제공하며, 코어 상태 모델은 각 개체의 상태는 각각의 개별 개체의 처리 상태에 대해 수행하고, 그 상태에 의해 다른 상태로 제어의 전환하여야이고;

확장 된 상태가 특히 친절하지, 우리는 다른 국가의 전송을 수정해야합니다. 둘째, 구현 좋은 오류가 발생하기 쉬운으로, 더 유연합니다.

요약 :

전략 모드는 상황이 동작을 변경 국가에 의해 국가 개체의 상태로 현재의 수동 모드 전환을 변경하는 것을 목표로 의사 결정에 도달하기 위해 객체 자체에 의해 사용되는 활성 교체 전략이다, 상태를 변경하면 런타임에 발생합니다.

각 세트는, 알고리즘의 가정을 대체 할 수있다 미리 정책 패키지 패턴은 동적 요구의 적당한 선택 및 다른 조건, 다른 문제 Context 객체 동작중인 상태 모드 처리를 처리하는 단계;

추천

출처www.cnblogs.com/yssjun/p/11116652.html