소개하다
전략 모델은 알고리즘 패밀리를 정의하고 서로 교체 할 수 있도록 별도로 캡슐화합니다. 이 모델을 사용하면 알고리즘의 변경이 알고리즘을 사용하여 고객에게 영향을 미치지 않도록합니다.
텍스트
정책 모델을 이해하기 전에 먼저 예를 들어 봅시다. 일반적으로, 데이터 정당성을 확인하려면 스윕 문에 따라 종종 판단하지만 몇 가지 문제가 발생합니다. 우선, 수요를 증가 시키면 논리를 높이기 위해이 코드를 다시 수정해야하며 단위 테스트를 수행 할 때 점점 더 복잡해집니다. 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
validator = {
검증 : 함수 (값, 유형) {
스위치 (유형) {
사례 'isnonempty':
{
진실을 반환하십시오. // 비어 있지 않은 확인 결과
}
사례 'isnumber':
{
진실을 반환하십시오. // 숫자 확인 결과
부서지다;
}
사례 'isalphanum':
{
진실을 반환하십시오. // 알파늄 확인 결과
}
기본:
{
진실을 반환하십시오.
}
}
}
};
// 시험
Alert (Validator.validate ( "123", "Isnonempty"));
그렇다면 위 코드의 문제를 피하는 방법은 무엇입니까? 정책 패턴에 따르면 동일한 작업 코드를 다른 클래스로 별도로 캡슐화 한 다음 통합 정책 처리 클래스를 통해 처리 할 수 있습니다. 자, 먼저 정책 처리 클래스를 정의하고 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
var validator = {
// 모든 유효성 검사 규칙 처리 클래스를 저장할 수있는 모든 장소는 나중에 별도로 정의됩니다.
유형 : {},
// 확인 유형에 해당하는 오류 메시지입니다
메시지 : [],
// 물론 사용해야하는 확인 유형
구성 : {},
// 공개 검증 방법 노출
// 전달 된 매개 변수는 key => value 쌍입니다
검증 : 함수 (데이터) {
var i, msg, 유형, 체커, result_ok;
// 모든 오류 메시지를 지 웁니다
this.messages = [];
(데이터의 i) {
if (data.hasownproperty (i)) {
type = this.config [i]; // 키를 기반으로 유효성 검사 규칙이 있는지 확인합니다.
Checker = this.types [type]; // 확인 규칙에 대한 확인 클래스를 가져옵니다
if (! type) {
계속하다; // 확인 규칙이 존재하지 않으면 처리되지 않습니다.
}
if (! checker) {// 확인 규칙 클래스가 존재하지 않으면 예외가 발생합니다.
던지다 {
이름 : "ValidationError",
메시지 : "유형을 검증 할 핸들러 없음" + 유형
};
}
result_ok = checker.validate (data [i]); // 찾은 단일 확인 클래스를 사용하여 확인하십시오
if (! result_ok) {
msg = " *" + i + " *," + checker.instructions의 잘못된 값;
this.messages.push (msg);
}
}
}
haserrors ();
},
// 도우미
haserrors : function () {
이 this.messages.length! == 0;
}
};
그런 다음 나머지는 유형에 저장된 다양한 검증 클래스를 정의하는 것입니다. 여기에 몇 가지 예를 들어 보겠습니다.
코드 사본은 다음과 같습니다.
// 주어진 값이 비어 있지 않은지 확인하십시오
validator.types.isnonempty = {
검증 : 함수 (값) {
반환 값! == "";
},
지침 : "통과 된 가치는 비어있을 수 없다"
};
// 주어진 값이 숫자인지 확인하십시오
validator.types.isnumber = {
검증 : 함수 (값) {
반환! ISNAN (value);
},
지침 : "전달 된 값은 예를 들어 1, 3.14 또는 2010"과 같은 법적 번호 일 수 있습니다. "
};
// 주어진 값이 단지 문자 또는 숫자인지 확인
validator.types.isalphanum = {
검증 : 함수 (값) {
반환!/[^a-z0-9] /i.test (value);
},
지침 : "전달 된 가치는 문자와 숫자 만 보호 할 수 있으며 특수 문자를 포함 할 수 없습니다"
};
이를 사용할 때는 먼저 확인 해야하는 데이터 세트를 정의해야하며 각 데이터에 대해 확인 해야하는 규칙 유형을 정의해야합니다. 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
var data = {
First_name : "Tom",
last_name : "xu",
나이 : "알 수없는",
사용자 이름 : "Tomxu"
};
validator.config = {
First_name : 'Isnonempty',
나이 : 'isnumber',
사용자 이름 : 'Isalphanum'
};
마지막으로 확인 결과를 얻는 코드는 간단합니다.
코드 사본은 다음과 같습니다.
Validator.validate (데이터);
if (validator.haserrors ()) {
console.log (validator.messages.join ( "/n"));
}
요약
전략 패턴은 일련의 알고리즘을 정의합니다. 개념적으로, 이러한 알고리즘은 모두 똑같은 일을하지만 구현은 다릅니다. 모든 방법을 동일한 방식으로 호출하여 다양한 알고리즘 클래스와 사용 된 알고리즘 클래스 간의 커플 링을 줄일 수 있습니다.
다른 수준에서 알고리즘 클래스를 별도로 정의하면 단위 테스트가 용이 해집니다. 자체 알고리즘을 통해 별도로 테스트 할 수 있기 때문입니다.
실제로 알고리즘뿐만 아니라 거의 모든 유형의 규칙도 캡슐화 될 수 있습니다. 분석 프로세스 중에 다른 시간에 다른 비즈니스 규칙을 적용해야하므로 다양한 변경 사항을 처리하기 위해 정책 모델이 필요하다는 것을 고려할 수 있습니다.