일정 시간 간격 으로 학습 디자인 모델 ― 전략 모델

4075 단어 C++전략 모드
아이고, 드디어 출근 해 야 겠 다.출근 전 일주일 의 휴식.2 년 넘 게 일 하면 서 코드 품질 에 관심 을 가지 기 시작 했다.
    현재 의 이해 로 는 코드 품질, 기능 수 요 를 실현 하 는 것, 2 코드 가 독성 (유지 가능), 3 코드 의 확장 성 (디자인 모델).
    블 로그 가든 http://www.cnblogs.com/wanggary/archive/2011/04/07/2008796.html 화해시키다 
    csdn http://blog.csdn.net/wuzhekai1985/article/details/6665197 。
    비교적 긴 박문 에 대해 가 독성 이 좋아 서 사람들 로 하여 금 적지 않 은 이익 을 얻 게 하 는 동시에 눈 과 마음 을 즐겁게 한다.위의 두 링크 는 대비 이다.나의 공력 이 점점 높 아 지면 서 풍격 이 양호 하고 독창적 이 며 사상 적 인 박문 을 쓰 는 것 이 나의 추구 이다.다음 정책 모드 는 csdn 링크 로 전 송 됩 니 다.
    전략 모드 는 일련의 알고리즘 을 정의 하여 하나씩 밀봉 하고 서로 바 꿀 수 있 도록 하 는 것 을 말한다.이 모델 은 알고리즘 을 사용 하 는 고객 에 게 독립 적 으로 변화 시 킬 수 있 습 니 다.즉, 이러한 알고리즘 이 완성 한 기능 은 똑 같 고 대외 적 인 인터페이스 와 마찬가지 로 각자 의 실현 에 차이 가 있 을 뿐이다.전략 모드 로 알고리즘 을 밀봉 하면 효과 가 비교적 좋다.다음은 캐 시 (Cache) 의 대체 알고리즘 을 예 로 들 어 정책 모드 를 구현 합 니 다.
    캐 시의 대체 알고리즘 은 무엇 입 니까?간단하게 설명 하면 Cache 가 부족 할 때 Cache 컨트롤 러 는 Cache 의 한 줄 을 선택 하고 얻 고 싶 은 데이터 로 교체 해 야 합 니 다.선택 정책 은 Cache 의 대체 알고리즘 입 니 다.다음은 UML 그림 을 드 리 겠 습 니 다.
                                        
    ReplaceAlgorithm 은 추상 적 인 유형 으로 알고리즘 의 인 터 페 이 스 를 정 의 했 고 세 가지 유형 이 이 추상 적 인 유형, 즉 구체 적 인 알고리즘 실현 을 계승 했다.Cache 클래스 에서 대체 알고리즘 을 사용 해 야 하기 때문에 하 나 를 유지 하 였 습 니 다. Replace Algorithm 의 대상.이 UML 그림 의 구 조 는 바로 전략 모델 의 전형 적 인 구조 이다.다음은 UML 그림 에 따라 그 에 상응하는 실현 을 제시 합 니 다.
    우선 교체 알고리즘 에 대한 정 의 를 내 립 니 다.
//    
class ReplaceAlgorithm
{
public:
	virtual void Replace() = 0;
};
//         
class LRU_ReplaceAlgorithm : public ReplaceAlgorithm
{
public:
	void Replace() { cout<<"Least Recently Used replace algorithm"<<endl; }
};

class FIFO_ReplaceAlgorithm : public ReplaceAlgorithm
{
public:
	void Replace() { cout<<"First in First out replace algorithm"<<endl; }
};
class Random_ReplaceAlgorithm: public ReplaceAlgorithm
{
public:
	void Replace() { cout<<"Random replace algorithm"<<endl; }
};

    이 어 Cache 의 정 의 를 내 렸 다. 여기 서 관건 적 인 것 은 Cache 의 실현 방식 이 고객 의 사용 방식 에 직접적인 영향 을 주 었 고 그 관건 은 교체 알고리즘 을 어떻게 지정 하 느 냐 에 있다.
    방식 1: 매개 변 수 를 통 해 특정 알고리즘 의 지침 을 직접 지정 합 니 다.
//Cache        
class Cache
{
private:
	ReplaceAlgorithm *m_ra;
public:
	Cache(ReplaceAlgorithm *ra) { m_ra = ra; }
	~Cache() { delete m_ra; }
	void Replace() { m_ra->Replace(); }
};

    만약 이런 방식 을 사용한다 면 고객 은 이 알고리즘 들 의 구체 적 인 정 의 를 알 아야 한다.아래 와 같은 방식 으로 만 사용 할 수 있어 디 테 일이 너무 많이 노출 된 것 을 볼 수 있다.
int main()
{
	Cache cache(new LRU_ReplaceAlgorithm()); //        
	cache.Replace();
	return 0;
}

    방식 2: 매개 변 수 를 통 해 직접 지정 합 니 다. 포인터 가 아 닌 탭 입 니 다.이렇게 하면 고객 은 알고리즘 에 해당 하 는 라벨 만 알 면 되 고 알고리즘 의 구체 적 인 정 의 를 알 필요 가 없다.
//Cache        
enum RA {LRU, FIFO, RANDOM}; //  
class Cache
{
private:
	ReplaceAlgorithm *m_ra;
public:
	Cache(enum RA ra) 
	{ 
		if(ra == LRU)
			m_ra = new LRU_ReplaceAlgorithm();
		else if(ra == FIFO)
			m_ra = new FIFO_ReplaceAlgorithm();
		else if(ra == RANDOM)
			m_ra = new Random_ReplaceAlgorithm();
		else 
			m_ra = NULL;
	}
	~Cache() { delete m_ra; }
	void Replace() { m_ra->Replace(); }
};

    방식 에 비해 이런 방식 은 사용 하기에 훨씬 편리 하 다.사실은 이런 방식 은 간단 한 공장 모델 과 전략 모델 을 결합 시 켰 고 알고리즘 의 정 의 는 전략 모델 을 사 용 했 으 며 Cache 의 정 의 는 간단 한 공장 모델 을 사용 했다.
int main()
{
	Cache cache(LRU); //      
	cache.Replace();
	return 0;
}

    위의 두 가지 방식 은 구조 함수 가 모두 형 삼 이 필요 하 다.구조 함 수 는 인 자 를 사용 하지 않 아 도 됩 니까?세 번 째 실현 방식 을 제시 하 겠 습 니 다.
    방식 3: 템 플 릿 을 이용 하여 실현 합 니 다.알고리즘 은 템 플 릿 의 실제 인삼 을 통 해 지정 합 니 다.물론 인 자 를 사 용 했 습 니 다. 구조 함수 의 인자 가 아 닙 니 다.전략 모드 에서 매개 변수의 전달 은 피하 기 어렵 고 고객 은 반드시 특정한 알고리즘 을 지정 해 야 한다.
//Cache        
template <class RA>
class Cache
{
private:
	RA m_ra;
public:
	Cache() { }
	~Cache() { }
	void Replace() { m_ra.Replace(); }
};

    사용 방식 은 다음 과 같 습 니 다.
int main()
{
	Cache<Random_ReplaceAlgorithm> cache; //    
	cache.Replace();
	return 0;
}

좋은 웹페이지 즐겨찾기