首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有特定约束的类的设计模式

具有特定约束的类的设计模式
EN

Stack Overflow用户
提问于 2014-09-30 21:39:03
回答 5查看 374关注 0票数 1

我最近在一次面试中被问到这个问题。我必须为板球游戏设计类,其中将有一个团队类,球员类等等。一支板球队只能有11名队员。我必须设计这样的类,以便球队可以有一个约束,它只能有一定数量的球员的类型。例如,一个约束可以是一个队只能有4名击球手,5名保龄球手和2名全能投手。或者一支球队可以有3名击球手,6名保龄球手和2名全能球员的限制。

那么对于这样的场景,有没有特定的设计模式呢?

EN

回答 5

Stack Overflow用户

发布于 2014-09-30 21:42:43

没有。

总而言之(从下面的评论中)你最多可以有11个玩家。这就是限制。

我可以通过在构造函数中获得两种玩家的数量作为参数来很容易地解决这个问题-例如Team::Team(int batsmen, int bowlers) --并计算另一个数字作为差:

代码语言:javascript
运行
复制
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_;
};
票数 2
EN

Stack Overflow用户

发布于 2014-09-30 22:04:35

要真正说出任何有意义的事情,我需要更多的信息,关于游戏,关于未来。

我只能猜测问题的目标是什么。在某个时刻,他们可能会问:“如果限制条件是击球手的体重不能超过80公斤,那该怎么办?”

SOmething是这样的:

代码语言:javascript
运行
复制
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之间的关系时。

票数 1
EN

Stack Overflow用户

发布于 2014-09-30 21:57:36

这并不是关于特定的设计模式。

我认为这样的问题(特别是在面试中)的重点是你要充实各种设计选项。例如,让我们从

代码语言:javascript
运行
复制
class AbstractPlayer
{ /* stuff */ };

class Batsman : public AbstractPlayer
{ /* stuff */ };

class Bowler : public AbstractPlayer
{ /* stuff */ };

class AllRounder : public AbstractPlayer
{ /* stuff */ };

然后你就可以去

代码语言:javascript
运行
复制
class Team
{
public:
    void addPlayer(Batsman player);
    void addPlayer(Bowler player);
    void addPlayer(AllRounder player);

    /* stuff */ 
};

或者,它可以是

代码语言:javascript
运行
复制
class Team
{
public:
    void addBatsman(AbstractPlayer player);
    void addBowler(AbstractPlayer player);
    void addAllRounder(AbstractPlayer player);

    /* stuff */ 
};

不管怎样,你得决定你是不是

  1. 将这些球员存储在一个动态长度列表中,并在不同的整数属性中计算不同球员类型的数量,或者
  2. 将球员存储在三个不同的动态长度

列表中

到目前为止,一切顺利,现在假设您在Team类中有相同数量的球员类型。约束在哪里?它们可以在构造函数中设置为三个最大计数

代码语言:javascript
运行
复制
Team::Team(int maxBatsmanCount, int maxBowlerCount, int maxAllRounderCount) { ... }

或者可能有某种设置器方法(如果对于一个Team实例,数字可能会改变)

代码语言:javascript
运行
复制
Team::adjustConstraints(int maxBatsmanCount, int maxBowlerCount, int maxAllRounderCount) { ... }

我还能想到更多的方法。constraint类怎么样?但这取决于对Team类的要求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26122319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档