接上回:
http://www.csdn.net/develop/read_article.asp?id=11439
排兵布阵时使用interpreter模式, 可以让教练不用去hack,而是简单 的复用就可以完成复杂的战术。 在这个模式中,client是教练, context是球队,abstractexpression 是基本打法,terminalexpression 是单个队员的打法,nonterminal expression是一条线的打法, 好处是用类来表示打法,可以用 继承来改变或扩展打法;而且 "抽象打法树"中各节点的类的 实现大体类似,易于实现。缺点是 为每种打法定义一个类,当打法 很复杂时,很难维护。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: 基本打法* _前锋甲; 基本打法* _前锋乙; }; 
|