정의 : 알고리즘 세트를 정의하고 각 알고리즘을 캡슐화하고 교환 가능하게 만듭니다.
유형 : 행동 패턴
클래스 다이어그램 :
정책 패턴은 알고리즘의 캡슐화로 일련의 알고리즘을 해당 클래스로 캡슐화하며 이러한 클래스는 동일한 인터페이스를 구현하며 서로 대체 할 수 있습니다. 위에서 언급 한 동작 클래스 모드에는 알고리즘의 캡슐화 - 템플릿 메소드 모드에 중점을 둔 패턴이 있습니다. 클래스 다이어그램과 비교하여 정책 모드와 템플릿 메소드 모드의 차이는 별도의 캡슐화 클래스 컨텍스트가 있다는 것입니다. IT와 템플릿 메소드 모드의 차이점은 다음과 같습니다. 템플릿 메소드 모드에서 호출 알고리즘의 본문은 추상 부모 클래스에 있으며 전략 모드에서 호출 알고리즘의 본문은 캡슐화 클래스 컨텍스트에 캡슐화됩니다. 초록 전략 전략은 일반적으로 인터페이스이며 목적은 사양을 정의하는 것 뿐이며 일반적으로 논리를 포함하지 않습니다. 실제로 이것은 일반적인 구현 일뿐입니다. 실제 프로그래밍에서는 각각의 특정 전략 구현 클래스 사이에 필연적으로 동일한 논리가 있기 때문에 중복 코드를 피하기 위해 추상 클래스를 사용하여 전략의 역할을 수행하고 공공 코드를 캡슐화합니다. 따라서 많은 응용 시나리오에서 템플릿 메소드 패턴의 그림자는 일반적으로 전략 모드에서 볼 수 있습니다.
정책 패턴의 구조
캡슐화 클래스 : 컨텍스트라고도하는 2 차 정책 캡슐화는 고급 모듈에 의한 정책에 대한 직접적인 호출을 피하는 것입니다.
초록 전략 : 일반적으로 인터페이스. 각 구현 클래스에 중복 논리가 있으면 추상 클래스를 사용하여 공통 코드 의이 부분을 캡슐화합니다. 현재 정책 패턴은 템플릿 메소드 패턴처럼 보입니다.
특정 전략 : 특정 전략 역할은 일반적으로 알고리즘으로 캡슐화 된 일련의 클래스 세트에 의해 수행되며 이러한 클래스는 필요에 따라 자유롭게 대체 할 수 있습니다.
응용 프로그램 시나리오의 예 :
Liu Bei는 Jianggong에서 그의 아내와 결혼 할 것입니다. Zhuge Liang은 떠나기 전에 Zhao Yun (The Best Man)에게 세 가지 트릭을 주었고, 그것은 하늘의 비밀에 따라 그것을 분해함으로써 어려운 문제를 해결할 것이라고 말했습니다. 이봐, 그것은 정말 큰 문제를 해결했다고 가정 해 봅시다. 결국, Zhou Yu는 아내와 함께 군대를 부러 뜨 렸습니다. 먼저이 장면이 어떻게 생겼는지 봅시다.
이 장면의 요소에 대해 먼저 이야기 해 봅시다 : 세 가지 영리한 트릭, 하나의 영리한 속임수 및 하나의 영리한 트릭. Liang 형제는 영리한 속임수를 주었다. 영리한 트릭은 일반적으로 영리한 트릭으로 알려져 있습니다. 그런 다음 Zhao Yun은 영리한 속임수를 꺼내고 실행 한 다음 승리하는 노동자입니다. Java 프로그램을 사용하여이를 표현하는 방법은 무엇입니까?
먼저 사진을 보자?
세 가지 트릭은 같은 유형의 사물이므로 인터페이스를 작성해 봅시다.
패키지 com.yangguangfu.strategy; /**** @author [email protected] : afu* 먼저 전략 인터페이스를 정의합니다. 이것은 Zhuge Liang이 Zhao Yun에게 준 세 가지 트릭의 인터페이스입니다. */public interface istrategy {// 모든 트릭은 실행 가능한 알고리즘입니다. Public Void Operate (); }
그런 다음 세 가지 구현 클래스를 작성하면 세 가지 영리한 트릭이 있습니다.
영리한 계획 : Wu에 첫 도착 :
패키지 com.yangguangfu.strategy; /**** @author [email protected] : a fu* Qiao 씨에게 도움을 요청하십시오. 그래서 Sun Quan은 Liu Bei를 죽일 수 없습니다. */ public class backdoor는 istrategy {@override public void operate () {system.out.println ( "오래된 Qiao Guo의 도움을 구하기 위해 Wu Guotai가 Sun Quan에게 Liu Bei를 죽일 수 없도록 Sun Quan에게 압력을 가하게하자"); }}
두 번째 요령 : Wu Guotai에게 녹색 불을 줘서 놓아주십시오.
패키지 com.yangguangfu.strategy; /**** @author [email protected] : a fu* wu guotai에게 녹색 불을 줘. */ public class givengreenlight는 istrategy {@override public void operate () {system.out.println을 구현합니다 ( "Wu Guotai에게 녹색 빛을주십시오!"); }}
기술 3 : Sun 부인은 뒤쪽을 차단하고 추적자들을 차단합니다.
패키지 com.yangguangfu.strategy; /**** @author [email protected] : AFU* Sun 부인은 뒤쪽을 차단하고 추적자를 차단했습니다. */ public class Blackenemy는 istrategy {@override public void operate () {system.out.println ( "Mrs. Sun이 등을 차단하고 추적자를 차단합니다 ..."); }}
좋아, 모두, 세 가지 트릭이 있으므로 팁에 넣을 곳이 있습니다.
패키지 com.yangguangfu.strategy; / ** * * @author [email protected] : AFU * */ Public Class Context {private istrategy 전략; // 생성자, 어떤 속임수? } public void operate () {this.strategy.operate (); }}
그런 다음 Zhao Yun은 큰 용기로 세 가지 팁을 가지고 있었고, 이미 노인의 계급에 들어가서 무고한 소녀와 결혼하고 싶었던 노인 Liu Bei를 끌어 당기고 아내와 결혼하기를 원했습니다. 안녕하세요, Liang 형제의 세 가지 트릭은 정말 좋습니다. 바라보다:
패키지 com.yangguangfu.strategy; 공개 클래스 Zhaoyun { /*** Zhao Yun이 나타났습니다. Zhuge Liang의 그에게 설명에 따르면, 그는 차례로 트릭을 차례로 분해했다*/ public static void main (String [] args) {문맥 컨텍스트; // When I first arrived in Wu, I disassembled the first System.out.println("-----------------------------------------"); 컨텍스트 = 새로운 컨텍스트 (new backdoor ()); context.operate (); // execute system.out.println ( "/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n"); // Liu Bei가 기꺼이 기꺼이 기꺼이 기꺼이 기뻐했을 때 기꺼이 기꺼이 기꺼이 기꺼이 기꺼이 기뻐하지 않기를 원하지 않으려는 기꺼이 기뻐했을 때 의지가되지 않으려하지 않으려는 의지가되지 않기를 원하지 않으려는 의지가되지 않으려하지 않으려하지 않으려는 의지가되지 않으려하지 않으려하지 않으려는 의지가되지 않으려하지 않으려하지 않으려하지 않으려는 의지가되지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려는 의지가되지 않으려하지 않으려는 의지가되지 않으려는 의지가되지 않으려는 의지가되지 않으려는 의지가되지 않으려는 것이 아니라 꺼려하지 않으려는 의지가되지 않기를 원하지 않으려는 꺼려하지 않으려는 꺼려하지 않으려는 의지가되지 않기를 원하지 않으려는 의지가되지 않기를 원하지 않으려하지 않으려는 의지가되지 않기를 원하지 않으려하지 않으려는 의지가되지 않으려하지 않으려는 의지가되지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않으려하지 않습니다. 컨텍스트 = 새로운 컨텍스트 (New Blackenemy ()); context.operate (); // 분해 및 실행 System.out.println ( "/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n
정책 모드의 장점과 단점 정책 모드의 주요 장점은 다음과 같습니다.
정책 클래스를 자유롭게 전환 할 수 있으며 정책 클래스는 동일한 추상화를 구현하기 때문에 자유롭게 전환 할 수 있습니다.
확장하기 쉽고 새로운 정책을 추가하는 것은 정책 모델에 매우 쉽고 원래 코드를 변경하지 않고도 기본적으로 확장 할 수 있습니다.
여러 조건을 사용하지 마십시오. 정책 모드를 사용하지 않는 경우 모든 알고리즘에 대해 조건부 명세서를 연결하는 데 사용해야하며 조건부 판단을 통해 사용되는 알고리즘을 사용해야합니다. 이전 기사에서는 여러 조건부 판단을 사용하는 것이 유지하기가 매우 어렵다고 언급했습니다.
전략 모델에는 두 가지 주요 단점이 있습니다.
다양한 정책 수업을 유지하면 개발에 추가로 오버 헤드가 제공됩니다. 이와 관련하여 경험이있을 수 있습니다. 일반적으로, 정책 클래스의 수는 5를 초과하여 더 귀찮습니다.
모든 정책 클래스는 사용하기가 고객에게 달려 있기 때문에 모든 정책 클래스는 클라이언트 (발신자)에 노출되어야하므로 클라이언트는 어떤 정책이 있는지 알고 다양한 정책의 차이점을 이해해야합니다. 그렇지 않으면 결과가 심각합니다. 예를 들어, 빠른 정렬, 버블 분류 및 선택 정렬의 세 가지 알고리즘을 제공하는 알고리즘 정렬을위한 전략 모델이 있습니다. 클라이언트가 이러한 알고리즘을 사용하기 전에이 세 가지 알고리즘의 적용을 이해해야합니까? 예를 들어, 클라이언트는 링크 된 목록 및 배열로 구현되는 컨테이너를 사용해야합니다. 클라이언트는 링크 된 목록과 배열의 차이점을 이해해야합니까? 이와 관련하여, 그것은 Dimitian 법과 상반됩니다.
해당 시나리오
객체 지향 설계를 수행 할 때는 정책 패턴에 대해 매우 익숙해야합니다. 이는 객체 지향에서 본질적으로 상속 및 다형성이기 때문입니다. 정책 패턴의 일반적인 코드를 읽은 후에는 정책 패턴에 대해 들어 본 적이 없더라도 개발 과정에서 그것을 사용했을 것입니다. 적어도 다음 두 상황에서는 전략 모델 사용을 고려할 수 있습니다.
여러 클래스의 주요 논리는 동일하며 부분 논리의 알고리즘과 동작에는 약간의 차이 만 있습니다.
몇 가지 유사한 동작 또는 알고리즘이 있으며 클라이언트는 사용할 것인지 동적으로 결정해야하므로 정책 패턴을 사용하여 클라이언트가 호출 할 수있는 이러한 알고리즘을 캡슐화 할 수 있습니다.
전략 모델은 간단하고 일반적으로 사용되는 모델입니다. 우리가 발전 할 때, 우리는 종종 의도적으로 또는 의도적으로 사용합니다. 일반적으로 전략 모델은 단독으로 사용되지 않으며 템플릿 메소드 모드, 공장 모드 등과 함께 혼합 방식으로 사용하는 것이 더 일반적입니다.