我最近在一次面试中被问到这个问题。我必须为板球游戏设计类,其中将有一个团队类,球员类等等。一支板球队只能有11名队员。我必须设计这样的类,以便球队可以有一个约束,它只能有一定数量的球员的类型。例如,一个约束可以是一个队只能有4名击球手,5名保龄球手和2名全能投手。或者一支球队可以有3名击球手,6名保龄球手和2名全能球员的限制。
那么对于这样的场景,有没有特定的设计模式呢?
发布于 2014-09-30 21:42:43
没有。
总而言之(从下面的评论中)你最多可以有11个玩家。这就是限制。
我可以通过在构造函数中获得两种玩家的数量作为参数来很容易地解决这个问题-例如Team::Team(int batsmen, int bowlers)
--并计算另一个数字作为差:
class Team {
public:
Team::Team (int batsmen, int bowlers){
if (batsmen + bowlers > 14)
throw std::runtime_error ("Too many players");
int rounders = 14 - batsmen - bowlers;
// Allocate players
}
private:
std::vector<Batsman> bat_;
std::vector<Bowler> bows_;
std::vector<Rounder> rounds_;
};
发布于 2014-09-30 22:04:35
要真正说出任何有意义的事情,我需要更多的信息,关于游戏,关于未来。
我只能猜测问题的目标是什么。在某个时刻,他们可能会问:“如果限制条件是击球手的体重不能超过80公斤,那该怎么办?”
SOmething是这样的:
void Main()
{
Console.WriteLine("Current team valid: " +
new Team(
new List<Player>{
new Batsmen(),
new Batsmen(),
new Batsmen(),
new Batsmen()
}).IsTeamValid());
}
abstract class Player {}
class Batsmen : Player{}
class Team {
static readonly IList<TeamConstraint> DefaultConstraints
= new List<TeamConstraint>{new BatsmenConstraint()};
IList<TeamConstraint> _constraints;
IList<Player> _players;
public Team(IList<Player> players) : this(players, DefaultConstraints){}
public Team(IList<Player> players, IList<TeamConstraint> constraints){
_constraints = constraints;
_players = players;
}
public bool IsTeamValid(){
return _constraints.All(constraint => constraint.IsValid(_players));
}
}
abstract class TeamConstraint
{
public abstract bool IsValid(IList<Player> players);
}
class BatsmenConstraint : TeamConstraint
{
const int batsmenRequiredDefault = 4;
readonly int _batsmenRequired;
public BatsmenConstraint(int batsmenRequired = batsmenRequiredDefault){
_batsmenRequired = batsmenRequired;
}
public override bool IsValid(IList<Player> players){
return players.OfType<Batsmen>().Count() == _batsmenRequired;
}
}
正如您所看到的,约束与Team类是分开的。这样,您将遵循可靠的原则。
您可以:
1)动态添加新的团队配置
2)在不修改现有系统的情况下,动态创建新的约束。
关于你的问题,没有“板球游戏设计模式”。在尝试解决这个问题时,你可以使用一些不同的模式,其中一个模式比其他模式更适合这个问题,等等。
我在这里主要做的是我使用了"bridge pattern“,以便
将抽象与其实现解耦,以便两者可以独立变化。
当谈到团队和TeamConstraint之间的关系时。
发布于 2014-09-30 21:57:36
这并不是关于特定的设计模式。
我认为这样的问题(特别是在面试中)的重点是你要充实各种设计选项。例如,让我们从
class AbstractPlayer
{ /* stuff */ };
class Batsman : public AbstractPlayer
{ /* stuff */ };
class Bowler : public AbstractPlayer
{ /* stuff */ };
class AllRounder : public AbstractPlayer
{ /* stuff */ };
然后你就可以去
class Team
{
public:
void addPlayer(Batsman player);
void addPlayer(Bowler player);
void addPlayer(AllRounder player);
/* stuff */
};
或者,它可以是
class Team
{
public:
void addBatsman(AbstractPlayer player);
void addBowler(AbstractPlayer player);
void addAllRounder(AbstractPlayer player);
/* stuff */
};
不管怎样,你得决定你是不是
列表中
到目前为止,一切顺利,现在假设您在Team
类中有相同数量的球员类型。约束在哪里?它们可以在构造函数中设置为三个最大计数
Team::Team(int maxBatsmanCount, int maxBowlerCount, int maxAllRounderCount) { ... }
或者可能有某种设置器方法(如果对于一个Team
实例,数字可能会改变)
Team::adjustConstraints(int maxBatsmanCount, int maxBowlerCount, int maxAllRounderCount) { ... }
我还能想到更多的方法。constraint类怎么样?但这取决于对Team
类的要求。
https://stackoverflow.com/questions/26122319
复制相似问题