mvc不講了。說一個非常有用的:策略模式。
策略模式的思想在設計模式裏面寫的非常清楚,概括下來就是將行爲和行爲的實現分離。在head 設計模式這本書裏面講的例子也非常容易理解,基本上可以直接搬到遊戲中來。
如圖:
在遊戲中,玩家,怪味,NPC,坐騎,寵物,俠客等等,他們都是可以活動的對象,也有一些共同的行爲,所以都可以由一個基類派生出來,但是他們也有很多不同的行爲,比如NPC不能戰鬥,坐騎不能說話,等等。
策略模式爲我們很好地解決了這個問題,方法如下:
1 將各個行爲在基類做出相應的接口,比如上面圖章actor這個類擁有6個接口,移動,跳躍,跑動,談話,換裝,戰鬥。然後actor類用空的實現(什麼事情都不做)來實現這些接口。然後各個子類在繼承actor類時,就有了對所有接口的一個空實現了。
2 分析各個子類需要的實現方式,分別實現爲各個行爲類,比如玩家需要跳躍,那麼實現一個玩家跳躍類,在role對象初始化時,將這個跳躍類的對象複製給行爲變量,這樣玩家就可以跳躍了;
下面貼一些僞代碼,幫助理解:
public class Actor
{
public TalkInterface talk;
public MoveInterface move;
public FightInterface fight;
public Actor()
{
talk = new DefaultTalk();
move = new DefaultMove();
fight = new DefaultFight();
}
}
public class Role : Actor
{
public Role()
{
move = new NormalMove();
fight = new RoleFight();
}
}
public class Horse : Actor
{
public Horse()
{
move = new HorseMove();
}
}
public class NPC : Actor
{
public NPC()
{
talk = new NpcTalk();
}
}
interface TalkInterface
{
void doTalk();
}
interface MoveInterface
{
void doMove();
}
interface FightInterface
{
void doFight();
}
public class DefaultTalk : TalkInterface
{
void doTalk() // do nothing
{
}
}
public class DefaultMove : MoveInterface
{
void doMove() // do nothing
{
}
}
public class DefaultFight : FightInterface
{
void doFight() // do nothing
{
}
}
public class NpcTalk : TalkInterface
{
public void doTalk()
{
...
}
}
public class NormalMove : MoveInterface
{
public void doMove()
{
...
}
}
public class HorseMove : MoveInterface
{
public void doMove()
{
...
}
}
public class RoleFight : FightInterface
{
public void doFight()
{
...
}
}
這樣的好處就有很多了,比如用基類的引用類型去調用各個子類對象的各個行爲都可以正常工作了。