足球戰(zhàn)術(shù)中最重要的應(yīng)該是隊(duì)員的跑動(dòng),而對(duì)于全體隊(duì)員的跑動(dòng)應(yīng)該符合observer模式才對(duì)。因?yàn)樽鳛閟ubject的傳球隊(duì)員不僅僅是要對(duì)被傳球的隊(duì)員發(fā)送消息,而且要改變所有隊(duì)員(observers)的跑動(dòng)方式。廣播的方式應(yīng)該分為兩種情況:推和拉。被傳球的隊(duì)員是接收推的方式,由傳球隊(duì)員的傳球路線直接引導(dǎo)他的跑動(dòng)路線。其他隊(duì)員是接收拉的方式,由視覺接受傳球隊(duì)員的跑動(dòng)及傳球路線繼而決定自己的跑動(dòng)。代碼如下:
class 無(wú)球隊(duì)員{
public:
virtual ~觀察();
virtual void 跑動(dòng)(傳球隊(duì)員* 傳球路線)=0;
PRotected:
觀察();
};
class 傳球隊(duì)員{
public:
virtual ~傳球消息();
virtual void 預(yù)備傳球(無(wú)球隊(duì)員*);
virtual void 繼續(xù)帶球(無(wú)球隊(duì)員*);
virtual void 傳球();
protected:
傳球消息();
private:
List<無(wú)球隊(duì)員*> *_無(wú)球隊(duì)員;
};
void 傳球消息::預(yù)備傳球(無(wú)球隊(duì)員* 對(duì)象){
_無(wú)球隊(duì)員->開始觀察(對(duì)象);
}
void 傳球消息::繼續(xù)帶球(無(wú)球隊(duì)員* 對(duì)象){
_無(wú)球隊(duì)員->停止跑動(dòng);
}
void 傳球消息::傳球(){
ListIterator<無(wú)球隊(duì)員*> i(_無(wú)球隊(duì)員);
for (i.First();i.IsDone();i.Next()){
i.CurrentItem()->傳球后更新跑動(dòng)(this);
}
}
隊(duì)形的保持需要memento模式,非凡是兩個(gè)邊后衛(wèi),上一場(chǎng)意甲AC米蘭輸給佩努賈,主要是因?yàn)檫吅笮l(wèi)助攻后未回原位所致。這里使用memento主要是象使用contra那樣讓邊后衛(wèi)兼任邊前衛(wèi),但假如隊(duì)員能力不足,或防守任務(wù)過(guò)于艱巨,以至于需要邊后衛(wèi)反復(fù)無(wú)效的往返奔跑則不應(yīng)該使用此模式。這里由教練事先演練的算法,由一個(gè)虛擬的caretaker由進(jìn)攻的需要向邊后衛(wèi)(originator)發(fā)出請(qǐng)求,生成一個(gè)虛擬的memento,后衛(wèi)前插助攻,防守時(shí)邊后衛(wèi)因?yàn)閏aretaker的防守需要的請(qǐng)求,返回到memento的位置。
代碼如下:
class 邊后衛(wèi){
public:
防守位置* 創(chuàng)建防守位置();
void 設(shè)置防守位置(const 防守位置*);
private:
位置* _位置;
};
class 防守位置{
public:
virtual ~防守位置();
pivate:
friend class 邊后衛(wèi);
防守位置();
void 設(shè)置位置(位置*);
位置* 得到位置();
private:
位置* _位置;
};
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注