異常牛Xのポリシ


policyは規定された規則制度のような一般的な疑問はなく、実行する政府戦略や会社の規則規則に従って、strategyは計画に似ています.例えば、私は会社の経営戦略マーケティング戦略を開きたいと思っています.今日はlokiライブラリのpolicyと設計モードのstrategyを区別することについて議論します.
Modern C++Designの第1章はPolicy Based Class Designであり、この技術がLokiライブラリ全体の設計基礎であることがわかる.この方式の利点は、ライブラリの柔軟性を高めることができる、多重性を向上させることである.簡単に言えば、1つのPolicy Based Classは多くの基本的なPolicyから構成され、各Policy Classはこの複雑なクラス(比較的複雑な)クラスのいくつかの行為または特性を表す.クラスの継承に似ていますが、もちろんクラスの継承とは違います.
慣例に従って、まず需要について話します.自動更新プログラムを完了する必要があります.4つの状況に分ける.更新、更新リスト、自動ダウンロード、メインプログラム起動時にインストールします.この4つのケースは非常に似ており、基本的に以下の関数を含むか、または部分的に含む.CheckDownLoad、InitDownload、ExecDownload、InitUpdate、ExecUpdateの場合、更新:ユーザーのワンポイント更新(CheckDownLoad、InitDownload、ExecDownload、InitUpdate、ExecUpdate)、ダウンロードと更新が一気に行われる.更新リスト(CheckDownLoad、InitDownloadとCheckDownLoad、InitDownload、ExecDownload、InitUpdate、ExecUpdate)の違いは、更新リストを先に表示する必要があり、ユーザーポイントが確定してから更新する.自動ダウンロード(CuoFenControl、CheckDownLoad、InitDownload、IsNeedDown、ExecDownload、CCallBackTimerRun)メインプログラム起動はインストール(OnlyInitDownload、InitUpdate、CCallBackFirstRunおよびInitUpdate)です.
Policyはこれに対処する最善の方法です.
1.UpdatePolicy.h
#ifndef UpdatePolicy_H
#define UpdatePolicy_H
#include "UpdateAuto.h"
#include "CommandEventMediator.h"

class CGetUpdateListCuoFeng
{
public:
	static bool Excute();
};


class CGetUpdateList
{
public:
	static bool Excute();
};

class CGetUpdateListNoDownload
{
public:
	static bool Excute();
};

class CDownLoadNormal
{
public:
	static bool Excute();
};

class CDownLoadTimer
{
public:
	static bool Excute();
};

class CUpdateNormal
{
public:
	static bool Excute();
};

class CInstallUpdate
{
public:
	static bool Excute();
};

class CInstallCheck
{
public:
	static bool Excute();
};

class CExcuteNothing
{
public:
	static bool Excute()
	{
		return true;
	}
};
class CCallBackNothing
{
public:
	CCallBackNothing()
	{

	}
	void operator ()(const bool _bSuccess)
	{

	}
};

template<class GetUpdateListPolicy = CGetUpdateList,class DownLoadPolicy = CDownLoadNormal,class UpdatePolicy = CUpdateNormal,class CCallBack = CCallBackNothing>
class CUpdateAutoRun
{
public:
	typedef CUpdateAutoRun<GetUpdateListPolicy, DownLoadPolicy, UpdatePolicy,CCallBack> __thisClass;
	static void ThreadRun()
	{
		_beginthread(&__thisClass::_Run, 0, 0);
	}

	static void _Run(void *p = NULL)
	{
		bool bRet = false;
		TheUpdateAuto::Instance().SetRunning(true);
		if (GetUpdateListPolicy::Excute() && DownLoadPolicy::Excute() && UpdatePolicy::Excute())
		{
			bRet = true;

		}
		CCallBack *pCallBack = new CCallBack();
		(*pCallBack)(bRet);
		delete pCallBack;
		pCallBack = NULL;
		TheCommandEventMediator::Instance().InvokeEvent(CCommandEventMediator::UPDATEEND);
		TheUpdateAuto::Instance().SetRunning(false);
	}
};

#endif /*UpdatePolicy_H*/

2.UpdatePolicy.cpp
#include "stdafx.h"
#include "UpdatePolicy.h"
...

bool CGetUpdateList::Excute()
{
	return TheUpdateAuto::Instance().CheckDownLoad()
		&& TheUpdateAuto::Instance().InitDownload();
}

bool CGetUpdateListNoDownload::Excute()
{
	return TheUpdateAuto::Instance().InitDownload();
}
...

3.これらを組み合わせる
typedef CUpdateAutoRun<CGetUpdateListCuoFeng,CDownLoadTimer,CExcuteNothing,CCallBackTimerRun> CUpdateCuoFen;
typedef CUpdateAutoRun<CGetUpdateList,CDownLoadNormal,CUpdateNormal> CNoCuoFenUpdateNormal;
typedef CUpdateAutoRun<CGetUpdateListNoDownload,CExcuteNothing,CInstallCheck,CCallBackFirstRun> CUpdateCheck;
typedef CUpdateAutoRun<CExcuteNothing,CExcuteNothing,CInstallUpdate> CJustUpdate;
4.このように び す.
	CNoCuoFenUpdateNormal::ThreadRun();
わります.