제갈량 의 세 가지 비단 주머니 속 의 묘책 에서 전략 모델 을 논 하 다.
이 이야기 에 우리 가 흥 미 를 느끼 는 것 은 세 가지 비단 주머니 속 의 묘책 이다.제갈량 은 반드시 전략 모델 을 운용 하 는 고수 일 것 이다. 우 리 는 제갈량 이 왜 이렇게 번 거 로 워 야 하 는 지, 세 개의 금 낭 을 만들어 야 한다 고 생각한다. 그 는 한 개의 금 낭 만 만 만 들 수 있 고 이 세 가지 묘책 을 모두 그 위 에 쓸 수 있다.그러나 그 는 이렇게 하지 않 고 전략 모델 을 정확하게 활용 해 세 개의 금 낭 을 만 들 었 다.이렇게 하면 좋 은 점 이 매우 뚜렷 하 다. 제갈량 은 금 낭 하나 에 묘책 을 쓰 는데 그의 생각 은 매우 뚜렷 해서 세 가지 계책 이 서로 혼 란 스 럽 지 않 을 것 이다.그리고 조 운 은 묘 계 를 볼 때 도 매우 편리 하 다. 언제 어떤 묘 계 를 보고 사용 하 는 것 이 매우 편리 하 다. 만약 에 세 가지 묘책 이 함께 섞 이면 그 는 이렇게 편리 하지 않다.
지금 보면 이 이 야 기 는 전략 모델 의 문제 해결 방향 을 포함 하고 있다. 특정한 문 제 를 해결 하 는 데 여러 가지 방법 이나 알고리즘 이 있다. 예 를 들 어 제갈량 이 세 가지 묘책 을 주 었 다. 이런 공급 자 는 이런 여러 가지 방법 이나 알고리즘 을 독립 시 켜 야 한다. 예 를 들 어 제갈량 은 세 가지 묘책 을 세 개의 금 낭 으로 나 누 었 다. 이런 사용자, 예 를 들 어 조 운 등 해당 하 는 조건, 예 를 들 어 이야기 중의 적당 한 시간 등 이다.상응하는 방법 이나 알고리즘 을 사용 하 다.
앞에서 말 했 듯 이 명령 모드 는 행동 에 대한 패키지 입 니 다.전략 모델 은 사실 그것 의 해결 사고방식 과 마찬가지 로 알고리즘 에 대한 봉인 이다.물론 같은 인 터 페 이 스 를 갖 고 있다.
다음은 몇 가지 예 를 들 어 전략 모델 을 상세 하 게 말씀 드 리 겠 습 니 다.
첫 번 째 예 는 우리 가 배열 에 대한 정렬 입 니 다. 배열 의 정렬 에 많은 알고리즘 이 있 습 니 다. 우 리 는 사용자 가 지정 한 성형 배열 과 정렬 알고리즘 을 만 들 고 싶 습 니 다. 우 리 는 결 과 를 제시 합 니 다. 우 리 는 이렇게 할 수 있 습 니 다.
public int[] sort(int[] inArray,String type)
{
if(type.equals(“a”))
{
int k = 0;
for(int i=0;i<inArray.length;i++)
{
for(int j=i+1;j<inArray.length;j++)
{
if(inArray[i]> inArray[j])
{
k = inArray[i];
inArray[i] = inArray[j];
inArray[j] = k;
}
}
}
}
else if(type.equals(“b”))
{
int k = 0;
for(int i=0;i< inArray.length;i++)
{
for(int j=0;j< inArray.length-i-1;j++)
{
if(inArray [j]> inArray [j+1])
{
k = inArray [j];
inArray [j] = inArray [j+1];
inArray [j+1] = k;
}
}
}
}
}
분석: 상기 코드 에서 if 판단 문 구 는 쓰기 가 좋 지 않 고 type 이 null 일 때 빈 포인터 이상 이 발생 합 니 다.
솔 루 션: '문자열 상수. equals (문자열 변수)' 방법 으로 처리 해 야 합 니 다.(20090414 추가)
위의 코드 를 보 자마자 사람들 은 문제 가 매우 많다 고 느 꼈 다. 첫째, 모든 알고리즘 이 한데 뒤 섞 여 단일 한 직책 원칙 을 만족 시 키 지 못 한다.둘째, 세부 사항 에 의존 하고 원칙 을 뒤 바 꾸 는 것 에 만족 하지 않 는 다.셋째, 확장 성 이 좋 지 않 습 니 다. 새로운 알고리즘 을 추가 하려 면 이 방법 을 바 꿔 야 합 니 다.
다음은 전략 모델 의 해결 방향 을 살 펴 보 자.
먼저 모든 알고리즘 에 대해 하나의 인 터 페 이 스 를 추상 화 하 는 것 이다. 이것 은 확장 성의 기본 조건 을 만족 시 키 기 위해 거의 모든 모델 은 인 터 페 이 스 를 바탕 으로 해 야 한다.
public interface SortAlgorithm
{
public void sort(int[] inArr);
}
그 다음 에 각 알고리즘 의 구체 적 인 실현 은 Sort Algorithm 인 터 페 이 스 를 실현 하고 관심 사 에 대한 분 리 를 완 성 했 으 며 단일 한 직책 원칙 을 만족 시 켰 다.
public class SortOne implements SortAlgorithm
{
public void sort(int[] inArr)
{
int k = 0;
for(int i=0;i<inArr.length;i++)
{
for(int j=i+1;j<inArr.length;j++)
{
if(inArr[i]> inArr[j])
{
k = inArr[i];
inArr[i] = inArr[j];
inArr[j] = k;
}
}
}
}
}
public class SortTwo implements SortAlgorithm
{
public void sort(int[] inArr)
{
int k = 0;
for(int j=0;j< inArr.length-i-1;j++)
{
if(inArr[j]> inArr[j+1])
{
k = inArr[j];
inArr[j] = inArr[j+1];
inArr[j+1] = k;
}
}
}
}
그리고 클 라 이언 트 의 호출 을 보 겠 습 니 다.
public int[] sort(int[] inArray,String type)
{
SortAlgorithm sa;
if(type.equals(“a”))
{
sa = new SortOne();
}
else if(type.equals(“b”))
{
sa = new SrotTwo();
}
else
{
……
}
sa.sort(inArray);
}
위 에서 우 리 는 전략 모델 이 이 문제 에 대한 해결 을 완 성 했 고 단일 직책 원칙 을 만족 시 켰 다.일정한 확장 성 이 있 습 니 다. 알고리즘 을 추가 하면 Sort Algorithm 인 터 페 이 스 를 실현 하면 됩 니 다.
물론 우 리 는 클 라 이언 트 코드 에서 볼 수 있 듯 이 전략 모델 은 클 라 이언 트 가 구체 적 인 실현 류 에 대한 의존 을 완전히 제거 하지 않 았 기 때문에 우 리 는 새로운 알고리즘 을 추가 한 후에 클 라 이언 트 를 수정 해 야 한다.그래서 전략 모드 는 명령 모드 와 마찬가지 로 일정한 확장 성 을 초보 적 으로 증가 시 켰 을 뿐이다.만약 에 클 라 이언 트 가 구체 적 인 유형 에 대한 의존 을 완전히 없 애 려 면 공장 모델 과 결합 하여 이 문 제 를 더욱 최적화 시 킬 수 있 고 구체 적 인 방법 은 모두 가 스스로 할 수 있 으 며 여기 서 더 이상 설명 하지 않 을 수 있다.
전략 모드 란 쉽게 말 하면 알고리즘 에 대한 패키지 입 니 다.실제 인 코딩 과정 에서 우 리 는 각종 선택 알고리즘 문제 에 직면 하 게 될 것 이다. 이 럴 때 전략 모델 을 사용 할 수 있다. 다음은 하나의 예 로 본 고의 끝 이다.
만약 에 저희 가 POJO 류 가 있다 고 가정 하면 Employee 에 많은 사용자 의 정보 가 저장 되 어 있 습 니 다. 다음 과 같 습 니 다.
public class Employee
{
private int id;
private String name;
private double servedYears;
……
public void setId(int id)
{
this.id = id;
}
public int getId()
{
return this.id;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
public void setServedYears(double servedYears)
{
this.servedYears = servedYears;
}
public double getServedYears()
{
return this.servedYears;
}
……
}
현재 우 리 는 Employee 에 관 한 배열 이 있 습 니 다. 배열 을 정렬 해 야 합 니 다. 우 리 는 Arrays. sort () 를 사용 하여 이 배열 을 정렬 해 야 한 다 는 것 을 알 고 있 습 니 다. 그러나 이 방법 을 사용 할 때 우 리 는 먼저 Comparator 인 터 페 이 스 를 실현 해 야 합 니 다. 다음 과 같 습 니 다.
Arrays.sort(emps,new Comparator(){
Public int compare(Object o1,Object o2)
{
return ((Employee)o1).getServedYears()-((Employee)o2).getServedYears();
}
});
위 에서 POJO 대상 에 대한 정렬 과정 을 실 현 했 습 니 다. 현재 문 제 는 Employee 류 의 id, name, server Years 를 색인 으로 정렬 해 야 한 다 는 것 입 니 다.우 리 는 이것 이 분명히 여러 알고리즘 의 문제 이 고 전략 모델 로 문 제 를 해결 할 수 있다 는 것 을 알 수 있다.
id 를 인덱스 로 하 는 비교 기:
public class IdComparator implements Comparator
{
Public int compare(Object o1,Object o2)
{
return ((Employee)o1).getId()-((Employee)o2).getId();
}
}
name 을 색인 으로 하 는 비교 기:
public class NameComparator implements Comparator
{
Public int compare(Object o1,Object o2)
{
return ((Employee)o1).getName()-((Employee)o2).getName();
}
}
server Years 를 색인 으로 하 는 비교 기:
public class ServedYearsComparator implements Comparator
{
Public int compare(Object o1,Object o2)
{
return ((Employee)o1).getservedYears()-((Employee)o2).getServedYears();
}
}
그리고 우 리 는 구체 적 인 비교 기 를 얻 기 위해 공장 을 만 들 었 다.
public class Factory
{
public static Comparator getInstance(String type)
{
if(type.equals(“id”))
{
return new IdComparator();
}
else if(type.equals(“name”))
{
return new NameComparator();
}
else
{
return ServedYearsComparator();
}
}
}
그러면 우 리 는 클 라 이언 트 에 대해 인 코딩 을 할 수 있 습 니 다.
public void sort(Employee[] emps,String type)
{
Arrays.sort(emps,Factory.getInstance(type));
}
우 리 는 볼 수 있다.
공장 모델 의 전략 모델 을 결합 시 켜 다 중 알고리즘 문 제 를 잘 해결 했다. 각 알고리즘 을 추출 하여 단독 적 으로 관심 을 가지 고 단일 한 직책 원칙 을 만족 시 켰 다.의존 전도 원칙 을 만족 시 키 고 확장 성 이 좋 았 다.잠깐 만.
뭘 더 기 다 려?어서 실천 에 가서 이 모델 들 을 활용 하 세 요!
설명: 본문 발췌http://blog.csdn.net/hivon/archive/2006/01/23/586579.aspx
제 개인 적 인 이해 (20090408 추가): 결과 집합 처리 (결과 집합 을 대상 또는 다른 유형 으로 표시) 방법 은 인터페이스 에 넣 어 설명 합 니 다.구체 적 인 실현 클래스 는 이 인 터 페 이 스 를 실현 하고 이 방법 을 다시 작성 합 니 다. 결과 집합 을 대상 (예 를 들 어 User 대상) 으로 표시 할 수 있 습 니 다. 이것 이 바로 전략 입 니 다.복사 방법 을 하나 더 써 서 결과 집합 을 String 형식 으로 표시 합 니 다 (예 를 들 어 사용자 이름 만 얻 는 것). 이것 은 또 하나의 전략 입 니 다.이제 두 가지 전략 이 있 습 니 다. 실제 요구 에 따라 적당 한 맵 방법 (전략) 을 선택 하여 적당 한 결 과 를 얻 을 수 있 습 니 다. 이것 이 바로 디자인 모델 중의 전략 모델 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.