接上回:
http://www.csdn.net/develop/read_article.asp?id=11439
排兵布阵时使用interpreter模式,可以让教练不用去hack,而是简单的复用就可以完成复杂的战术。在这个模式中,client是教练,context是球队,abstractexpression是基本打法,terminalexpression是单个队员的打法,nonterminalexpression是一条线的打法,好处是用类来表示打法,可以用继承来改变或扩展打法;而且"抽象打法树"中各节点的类的实现大体类似,易于实现。缺点是为每种打法定义一个类,当打法很复杂时,很难维护。interpreter和composite(组合进攻)在实现上有很多相通之处,以下是需要考虑的特殊问题:1.抽象打法树的创建。可以使用经典教科书上的打法,也可以由教练提供。2.打法的实现可以采用visitor(全攻全守)来实现。3.当许多打法都以某个队员作为最终完成者时,这个队员可以作为flyweight来共享:)代码如下:class 基本打法{public: 基本打法(); virtual ~基本打法();
virtual bool 组织(球队&)=0; virtual 基本打法* 进攻(const char*,基本打法&)=0; virtual 基本打法* 防守(const char*,基本打法&)=0;};
class 球队{public: bool 找寻球员(const char*) const; void 赋给(球员打法*,bool);};
class 左后卫打法:public 基本打法{public: 左后卫打法(const char*); virtual ~左后卫打法();
virtual bool 组织(球队&); virtual 基本打法* 进攻(const char*,基本打法&); virtual 基本打法* 防守(const char*,基本打法&);private: char* _左后卫号码;};
class 双前锋打法:public 基本打法{public: 双前锋打法(基本打法*,基本打法*); virtual ~双前锋打法();
virtual bool 组织(球队&); virtual 基本打法* 进攻(const char*,基本打法&); virtual 基本打法* 防守(const char*,基本打法&);private: 基本打法* _前锋甲; 基本打法* _前锋乙;};