전략 모델 의 해석 과 사고

4927 단어
사실 전략 모델 에 대해 저 는 예전 에 알 고 있 었 습 니 다. 지금 다시 한 번 쓰 는 것 은 제 가 오늘 전략 모델 을 돌 이 켜 볼 때 이 모델 을 잘 사용 하지 않 았 다 는 것 을 알 았 기 때 문 입 니 다. 그래서 오늘 다시 한 번 돌 이 켜 보고 제 가 실제 업무 과정 에서 의 어 딘 가 를 결합 시 켜 제 가 어떤 부분 을 더 잘 최적화 할 수 있 는 지 돌 이 켜 보 겠 습 니 다.그리고 이번 주말 에 저 는 작업 중 코드 의 재 최적화 에 착수 하려 고 합 니 다.
먼저 전략 모델 의 총 요점, 전략 모델 의 핵심 은 조합 을 많이 사용 하고 계승 을 적 게 사용 하면 서로 다른 알고리즘 족 을 유연 하 게 교체 할 수 있다.
조합 을 많이 사용 하고 계승 을 적 게 사용 하 는 것 에 대해 말 한 이상 이런 서법 세 는 계승 과 비교 해 야 한다. 그러면 나 는 여기 서 하 나 를 정의 할 것 이다.
예 를 들 어 우 리 는 개 한 마 리 를 쓰 고 싶 습 니 다. 개 는 짖 고 꼬리 를 흔 들 수 있 습 니 다. 그리고 이 개 는 테 디 개 일 수도 있 고 늑대 개 일 수도 있 습 니 다. 짖 고 꼬리 를 흔 들 수도 있 습 니 다.
그렇다면 이때 우리 가 계승 하 는 방식 으로 쓰 면 먼저 개의 부 류 를 정의 한다.
<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. 이렇게 해서 실시 간 전환 을 실현 했다. 이런 모델 은 괜찮다 고 할 수 있다.
그러면 또 생각 할 시간 이 왔 다.
현재 로 서 는 이러한 모델 의 장점 은 계승 의 장점 이 있 고 특정한 기능 실현 방식 을 유연 하 게 설정 할 수 있 는 장점 을 확대 한 것 이다.
그러나 단점 도 하나 있다. 그것 은 프로젝트 가 비교적 클 때 종류 가 많이 변 한 다 는 것 이다. 물론 이것 도 자신의 통 제 를 통 해 통제 할 수 있다.
우리 가 실제 프로젝트 에 결합 할 때 또 하나의 문제 가 있 습 니 다. 우 리 는 일부 방법 이 서로 다른 곳 에 유연 하 게 배치 되 기 를 바 랍 니 다. 그러나 이러한 실현 방법 이 서로 다른 매개 변 수 를 필요 로 할 때 우 리 는 이 서로 다른 매개 변수의 전달 과 준 비 를 어떻게 써 야 합 니까? 만약 에 우리 가 준비 한 매개 변 수 를 하나의 대상 으로 봉 하여 전달 하면그러면 이 대상 의 매개 변수 가 많 을 것 이다. 그 때 사용 할 때 서로 다른 실현 류 에 대해 서로 다른 매개 변 수 를 설정 해 야 하기 때문에 더욱 번 거 로 워 질 것 이다. 그래서 이곳 의 이 모델 의 사용 은 쓰기 전에 잘 고려 해 야 한다.
그래도 한 마디 수확 이 있다.

좋은 웹페이지 즐겨찾기