Éè¼ÆÄ£Ê½Ö®strategyģʽ(C++ʵÏÖ) (Ò»)

2014-11-24 02:32:57 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 3

²ßÂÔģʽÊÇÒ»ÖֱȽϳ£ÓõÄÉè¼ÆÄ£Ê½£¬ËûÖ÷ÒªÌåÏÖÔÚ¶ÔÏó¿ÉÒÔÓÐij¸öÐÐΪ£¬µ«ÊÇÔÚ²»Í¬µÄ³¡¾°Ê±Óò»Í¬µÄʵÏÖ·½·¨£¡

ÔÚÈí¼þ¿ª·¢ÖÐÒ²³£³£Óöµ½ÀàËÆµÄÇé¿ö£¬ÊµÏÖijһ¸ö¹¦ÄÜÓжàÖÖËã·¨»òÕß²ßÂÔ£¬ÎÒÃÇ¿ÉÒÔ¸ù¾Ý»·¾³»òÕßÌõ¼þµÄ²»Í¬Ñ¡Ôñ²»Í¬µÄËã·¨»òÕß²ßÂÔÀ´Íê³É¸Ã¹¦ÄÜ¡£Èç²éÕÒ¡¢ÅÅÐòµÈ£¬Ò»ÖÖ³£Óõķ½·¨ÊÇÓ²±àÂë(Hard Coding)ÔÚÒ»¸öÀàÖУ¬ÈçÐèÒªÌṩ¶àÖÖ²éÕÒËã·¨£¬¿ÉÒÔ½«ÕâЩË㷨дµ½Ò»¸öÀàÖУ¬ÔÚ¸ÃÀàÖÐÌṩ¶à¸ö·½·¨£¬Ã¿Ò»¸ö·½·¨¶ÔÓ¦Ò»¸ö¾ßÌåµÄ²éÕÒËã·¨£»µ±È»Ò²¿ÉÒÔ½«ÕâЩ²éÕÒËã·¨·â×°ÔÚÒ»¸öͳһµÄ·½·¨ÖУ¬Í¨¹ýif¡­else¡­»òÕßcaseµÈÌõ¼þÅжÏÓï¾äÀ´½øÐÐÑ¡Ôñ¡£ÕâÁ½ÖÖʵÏÖ·½·¨ÎÒÃǶ¼¿ÉÒÔ³ÆÖ®ÎªÓ²±àÂ룬Èç¹ûÐèÒªÔö¼ÓÒ»ÖÖеIJéÕÒËã·¨£¬ÐèÒªÐ޸ķâ×°Ëã·¨ÀàµÄÔ´´úÂ룻¸ü»»²éÕÒËã·¨£¬Ò²ÐèÒªÐ޸Ŀͻ§¶Ëµ÷ÓôúÂë¡£ÔÚÕâ¸öËã·¨ÀàÖзâ×°ÁË´óÁ¿²éÕÒËã·¨£¬

¸ÃÀà´úÂ뽫½Ï¸´ÔÓ£¬Î¬»¤½ÏΪÀ§ÄÑ¡£Èç¹ûÎÒÃǽ«ÕâЩ²ßÂÔ°üº¬ÔÚ¿Í»§¶Ë£¬ÕâÖÖ×ö·¨¸ü²»¿ÉÈ¡£¬½«µ¼Ö¿ͻ§¶Ë³ÌÐòÅÓ´ó¶øÇÒÄÑÒÔά»¤£¬Èç¹û´æÔÚ´óÁ¿¿É¹©Ñ¡ÔñµÄË㷨ʱÎÊÌ⽫±äµÃ¸ü¼ÓÑÏÖØ¡£

ÎÒÃÇÒª×öµÄ¾ÍÊÇÈçºÎ°Ñÿ¸ö·½·¨·â×°ÔÚ²»Í¬µÄÀàÖУ¬¸ù¾ÝÐèÒªµ÷ÓÃÏàÓ¦µÄ·½·¨£¡

ÔÚÕâÀïͬÑùÓÃÁ½¸öÀý×Ó˵Ã÷ÎÊÌ⣺

1£º±ê×¼µÄ²ßÂÔģʽʵÏÖ·½·¨£¡

2£º¾­µäµÄÖî¸ðÁÁÈý²ßÂÔÖ¸µ¼ÕÔÔÆ¶«Îâ¾ÈÖ÷µÄ¹ÊÊ£¡

ÏÈÀ´¿´µÚÒ»¸ö£¬Ëû¼òµ¥Ò×¶®µÄ±íÃ÷Á˲ßÂÔģʽµÄÒ»°ã½á¹¹£¡

[cpp]
class StrategyInterface //³éÏóµÄ½Ó¿Ú
{
public:
virtual void execute() = 0;
};

class ConcreteStrategyA: public StrategyInterface //·½·¨A,ʵÏÖÁ˽ӿڣ¬ÏÂͬ
{
public:
virtual void execute()
{
cout << "Called ConcreteStrategyA execute method" << endl;
}
};

class ConcreteStrategyB: public StrategyInterface
{
public:
virtual void execute()
{
cout << "Called ConcreteStrategyB execute method" << endl;
}
};

class ConcreteStrategyC: public StrategyInterface
{
public:
virtual void execute()
{
cout << "Called ConcreteStrategyC execute method" << endl;
}
};

class Context { //Ö÷²Ù×÷Àà
private:
StrategyInterface *_strategy;

public:
Context(StrategyInterface *strategy):_strategy(strategy)
{
}

void set_strategy(StrategyInterface *strategy)
{
_strategy = strategy;
}

void execute()
{
_strategy->execute();
}
};

int main(int argc, char *argv[])
{
ConcreteStrategyA concreteStrategyA;
ConcreteStrategyB concreteStrategyB;
ConcreteStrategyC concreteStrategyC;

Context contextA(&concreteStrategyA);
Context contextB(&concreteStrategyB);
Context contextC(&concreteStrategyC);

contextA.execute(); //º¯ÊýÄÚ²¿ÀûÓöà̬µ÷ÓÃÏàÓ¦µÄ·½·¨£¡
contextB.execute();
contextC.execute();

contextA.set_strategy(&concreteStrategyB);
contextA.execute();
contextA.set_strategy(&concreteStrategyC);
contextA.execute();

return 0;
}

class StrategyInterface //³éÏóµÄ½Ó¿Ú
{
public:
virtual void execute() = 0;
};

class ConcreteStrategyA: public StrategyInterface //·½·¨A,ʵÏÖÁ˽ӿڣ¬ÏÂͬ
{
public:
virtual void execute()
{
cout << "Called ConcreteStrategyA execute method" << endl;
}
};

class ConcreteStrategyB: public StrategyInterface
{
public:
virtual void execute()
{
cout << "Called ConcreteStrategyB execute method" << endl;
}
};

class ConcreteStrategyC: public StrategyInterface
{
public:
virtual void execute()
{
cout << "Called ConcreteStrategyC execute method" << endl;
}
};

class Context { //Ö÷²Ù×÷Àà
private:
StrategyInterface *_strategy;

public:
Context(StrategyInterface *strategy):_strategy(strategy)
{
}

void set_strategy(StrategyInterface *strategy)
{
_strategy = strategy;
}

void execute()
{
_strategy->execute();
}
};

int main(int argc, char *argv[])
{
ConcreteStrategyA concreteStrategyA;
ConcreteStrategyB concreteStrategyB;
ConcreteStrategyC concreteStrategyC;

Context contextA(&concreteStrategyA);
Context contextB(&concreteStrategyB);
Con