전략 모델 의 해석 과 사고
먼저 전략 모델 의 총 요점, 전략 모델 의 핵심 은 조합 을 많이 사용 하고 계승 을 적 게 사용 하면 서로 다른 알고리즘 족 을 유연 하 게 교체 할 수 있다.
조합 을 많이 사용 하고 계승 을 적 게 사용 하 는 것 에 대해 말 한 이상 이런 서법 세 는 계승 과 비교 해 야 한다. 그러면 나 는 여기 서 하 나 를 정의 할 것 이다.
예 를 들 어 우 리 는 개 한 마 리 를 쓰 고 싶 습 니 다. 개 는 짖 고 꼬리 를 흔 들 수 있 습 니 다. 그리고 이 개 는 테 디 개 일 수도 있 고 늑대 개 일 수도 있 습 니 다. 짖 고 꼬리 를 흔 들 수도 있 습 니 다.
그렇다면 이때 우리 가 계승 하 는 방식 으로 쓰 면 먼저 개의 부 류 를 정의 한다.
<span style="font-size:14px;">public abstract class Dog {
/**
*
*/
public abstract void bite();
/**
*
*/
public abstract void wagTail();
}</span>
정 의 를 내 린 후에 우 리 는 먼저 늑대 개 한 마 리 를 실현 해 야 한다. 그러면 이렇게 실현 하 는 것 이다.
<span style="font-size:14px;">public class WolfDog extends Dog{
public static final String TAG = "tag";
/**
*
*/</span>
<span style="font-size:14px;"><span style="white-space:pre"> </span>@Override
public void bite(){
Log.i(TAG, "wolf dog bite");
}
/**
*
*/</span>
<span style="font-size:14px;"><span style="white-space:pre"> @Override</span>
public void wagTail(){
Log.i(TAG, "wolf dog wagtail");
}
}</span>
그때 우리 가 테 디 개 한 마 리 를 더 필요 로 할 때 당신 은 무엇 을 발견 할 수 있 습 니까? 테 디 개 는 꼬리가 없 기 때문에 그 는 꼬리 를 흔 들 지 않 습 니 다. 그러나 짖 을 때 똑 같 습 니 다. 모두 멍멍 짖 습 니 다. 그러면 늑대 개 에서 우 리 는 짖 는 방법 을 복사 해서 테 디 개 에 넣 어야 합 니 다. 꼬리 를 흔 드 는 방법 은 우 리 는 빈 공간 에서 만 실현 하면 됩 니 다.
그러나 계속 확장 해 나 갈 수 있 습 니 다. 고무 개, 전자 개, 여러 가지, 어떤 것 은 울 음소 리 가 같 고 어떤 것 은 다 릅 니 다. 똑 같은 것 에 대해 우 리 는 아버지 류 가 왕 왕 왕 울 음소 리 라 고 직접 쓸 수 있 습 니 다. 왕 왕 울 음소 리 가 아 닌 단독 실현 에 대해 서도 문제 가 있 습 니 다. 만약 에 파생 된 개 안에 고양이 가 울 었 다 면?
이런 방식 에 대해 물론 우 리 는 봉 인 된 도구 로 쓸 수 있 고 서로 다른 개 안에서 직접 호출 하여 실현 하면 되 지만 상황 도 있다.
만약 에 우리 가 슈퍼 전자 개 한 마 리 를 개발 하여 사람 을 만 나 서 말 을 하고 개 를 만 나 서 말 을 한다 면 이런 실시 간 변화 가 있 을 때 우 리 는 어떻게 해 야 합 니까?
그러면 이 럴 때 우리 가 전략 모델 을 사용 해 야 한다. 그러면 전략 모델 로 이 개 를 쓰 면 우 리 는 어떻게 써 야 합 니까?
우선, 나 는 두 개의 인 터 페 이 스 를 써 야 한다.
<span style="font-size:14px;">/**
*
*/
public interface BiteBehavior{
public void bite();
}
/**
*
*/
public interface WagTailBehavior{
public void wagTail();
}</span>
그리고 나 서 나 는 이 두 개의 인 터 페 이 스 를 실현 해 야 한다.
<span style="font-size:14px;">/**
*
*/
public class WangBite implements BiteBehavior{
@Override
public void bite() {
Log.i(TAG, "wang bite");
}
}
/**
*
*/
public class MiaoBite implements BiteBehavior{
@Override
public void bite() {
Log.i(TAG, "miao bite");
}
}
/**
*
*/
public class NormalWagTail implements WagTailBehavior{
@Override
public void wagTail() {
Log.i(TAG, "normal wagtail");
}
}
/**
*
*/
public class NoTail implements WagTailBehavior{
@Override
public void wagTail() {
}
}</span>
인 터 페 이 스 를 실현 한 후에 우 리 는 개의 정 의 를 시작 할 수 있다.
<span style="font-size:14px;">public class Dog {
private BiteBehavior mBiteBehavior;
private WagTailBehavior mWagTailBehavior;
public Dog(){
mBiteBehavior = new WangBite();
mWagTailBehavior = new NormalWagTail();
}
/**
*
*/
public void bite(){
mBiteBehavior.bite();
}
/**
*
*/
public void wagTail(){
mWagTailBehavior.wagTail();
}</span>
<span style="font-size:14px;">}</span>
이 를 통 해 알 수 있 듯 이 계승 과 달리 이런 모델 의 실현 방식 은 인터페이스 로 계승 을 대체 하 는 것 이 고 이런 방식 은 계승 의 장점 이 있다.
이때 우리 가 늑대 개 류 를 실현 하려 면 꼬리 를 흔 드 는 인 터 페 이 스 를 계승 해 새로운 방법 으로 쓰 면 되 고 방법 을 재 활용 할 수 있다.
그럼 아까 도 말 했 듯 이 슈퍼 스마트 개 한 마리 가 필요 하 다 면 사람 을 만 나 서 말 하고 개 를 만 나 서 말 하 는 방식 이 가능 할 까? 물론 이지.
우 리 는 한 가지 방법 만 추가 하면 된다.
4. 567913. 이렇게 해서 실시 간 전환 을 실현 했다. 이런 모델 은 괜찮다 고 할 수 있다.
그러면 또 생각 할 시간 이 왔 다.
현재 로 서 는 이러한 모델 의 장점 은 계승 의 장점 이 있 고 특정한 기능 실현 방식 을 유연 하 게 설정 할 수 있 는 장점 을 확대 한 것 이다.
그러나 단점 도 하나 있다. 그것 은 프로젝트 가 비교적 클 때 종류 가 많이 변 한 다 는 것 이다. 물론 이것 도 자신의 통 제 를 통 해 통제 할 수 있다.
우리 가 실제 프로젝트 에 결합 할 때 또 하나의 문제 가 있 습 니 다. 우 리 는 일부 방법 이 서로 다른 곳 에 유연 하 게 배치 되 기 를 바 랍 니 다. 그러나 이러한 실현 방법 이 서로 다른 매개 변 수 를 필요 로 할 때 우 리 는 이 서로 다른 매개 변수의 전달 과 준 비 를 어떻게 써 야 합 니까? 만약 에 우리 가 준비 한 매개 변 수 를 하나의 대상 으로 봉 하여 전달 하면그러면 이 대상 의 매개 변수 가 많 을 것 이다. 그 때 사용 할 때 서로 다른 실현 류 에 대해 서로 다른 매개 변 수 를 설정 해 야 하기 때문에 더욱 번 거 로 워 질 것 이다. 그래서 이곳 의 이 모델 의 사용 은 쓰기 전에 잘 고려 해 야 한다.
그래도 한 마디 수확 이 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.