足球戰術之observer及memento篇 (轉)

worldblog發表於2007-12-09
足球戰術之observer及memento篇 (轉)[@more@]

 

  足球戰術中最重要的應該是隊員的跑動,而對於全體隊員的跑動應該符合observer才對。因為作為subject的傳球隊員不僅僅是要對被傳球的隊員傳送訊息,而且要改變所有隊員(observers)的跑動方式。廣播的方式應該分為兩種情況:推和拉。被傳球的隊員是接收推的方式,由傳球隊員的傳球路線直接引導他的跑動路線。其他隊員是接收拉的方式,由視覺接受傳球隊員的跑動及傳球路線繼而決定自己的跑動。程式碼如下:
  class 無球隊員{
  public:
  virtual ~觀察();
  virtual void 跑動(傳球隊員* 傳球路線)=0;
  protected:
  觀察();
};

class 傳球隊員{
public:
  virtual ~傳球訊息();

  virtual void 準備傳球(無球隊員*);
  virtual void 繼續帶球(無球隊員*);
  virtual void 傳球();

protected:
  傳球訊息();
private:
  List *_無球隊員;
};

void 傳球訊息::準備傳球(無球隊員* ){
  _無球隊員->開始觀察(物件);
}

void 傳球訊息::繼續帶球(無球隊員* 物件){
  _無球隊員->停止跑動;
}

void 傳球訊息::傳球(){
  ListIterator i(_無球隊員);
  for (i.First();i.IsDone();i.Next()){
  i.CurrentItem()->傳球后跑動(this);
  }
}

隊形的保持需要memento模式,特別是兩個邊後衛,上一場意甲AC米蘭輸給佩努賈,主要是因為邊後衛助攻後未回原位所致。這裡使用memento主要是象使用contra那樣讓邊後衛兼任邊前衛,但如果隊員能力不足,或防守任務過於艱鉅,以至於需要邊後衛反覆無效的來回奔跑則不應該使用此模式。這裡由教練事先演練的演算法,由一個虛擬的caretaker由進攻的需要向邊後衛(originator)發出請求,生成一個虛擬的memento,後衛前插助攻,防守時邊後衛因為caretaker的防守需要的請求,返回到memento的位置。
程式碼如下:
class 邊後衛{
public:
  防守位置* 建立防守位置();
  void 設定防守位置(const 防守位置*);
private:
  位置* _位置;
};

class 防守位置{
public:
  virtual ~防守位置();
pivate:
  friend class 邊後衛;
  防守位置();

  void 設定位置(位置*);
  位置* 得到位置();
private:
  位置* _位置;
};


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990362/,如需轉載,請註明出處,否則將追究法律責任。

相關文章