2015-05-19 17 views
1

我正在开发一个基于Java的纸牌游戏,并且我准备了一套Managers子类,它们之间进行交互(like PlayerManager interacting with DeckManager)但是,为了达到这个目的,我需要在每个需要它的类中放置一个Manager。因此,举例来说:如何组织对象在各个类中重复? Java

if PlayerManager needs to a card from a deck --> executes drawCard() inside DeckManager, 
so inside PlayerManager there's a DeckManager object. 

的问题是,我不知道,如果是进行正确的做法,因为每次一Manager需要一个又一个,我会创造谁需要一个内部的需要经理它

有没有更好的方法?我想到做一个包含所有Managers的类,并使它成为static,但我不知道它是否好用Java。

+0

是否与用于同一玩家(相同的甲板)的“PlayerManager”一样?有没有额外的球员或甲板添加? –

+0

使用构造函数依赖注入:) – jgroehl

回答

0

简单的解决办法是使用Singleton模式

在经理级的有,如果它存在,如果没有对象实例化一个返回类的实例的方法。

public static synchronized Manager getInstance() 
    { 
     if (instance == null) 
      instance = new Singleton(); 

     return instance; 
    } 

然后,您可以调用属于该类的该对象的任何方法。

来源:http://www.oodesign.com/singleton-pattern.html

+0

纠正错字'Singleton';) –

+0

这似乎是最简单的方法,但为何对此感到灰心呢? –

+0

如果你正在学习,你应该使用这种方法。了解单身模式的用途以及如何使用它仍然非常重要。我不亲自知道原因不使用它,因为我已经从来没有真正使用它自己(我已经用代码,人们使用的单身人士的工作),并没有遇到任何问题。 –

1

你应该看看Singleton模式来解决这个问题,那么就会有可以“注入”到任何其他经理每个管理者的单个实例需要访问它:

public class MyManager { 

    private static MyManager singleton = new MyManager(); 

    /* Prevent instantiation 
    */ 
    private MyManager() { 
    } 

    /* return single instance */ 
    public static MyManager getInstance() { 
     return singleton; 
    } 
} 

注射如下:

public class MyOtherManager { 
    private MyManager = MyManager.instance(); 
} 

这是面向服务的设计很常见的模式(我假设你的经理重新提供你的服务层)。

5

不建议单身。它们可以防止多个实例在同一个进程中运行(这对于您的用例可能并不重要,但一般而言)并且它们使得单元测试更加困难(您不能嘲笑实例,这意味着对这些实例进行测试两个类是耦合的,不能独立测试)。

通常,您会在创建对象时将管理器传递给对象。例如,如果您有一个与DeckManager对象Game,它可以创建每个PlayerManager并将其自身(或DeckManager)传递给该对象的构造函数。

+1

非常感谢你!这是考虑到单身公牛** t周围通货膨胀所需要的;-) – jgroehl

+0

你为什么不推荐它? –

+0

我已经扩大了答案给的原因不建议单身。 –

2

听起来像依赖注入可以解决你的问题。依赖注入是将对象的依赖关系注入到其中(通常通过setter或构造函数)的做法。依赖注入框架(比如Spring)可以帮助你管理这个。考虑以下(注释是春天自动装配的利益 - 检查互联网了解更多详情:))

@Component 
public class DeckManager implements IDeckManager { 
    public Card drawCard() { 
     // Implementation here 
    } 
} 

@Component 
public class PlayerManager implements IPlayerManager { 

    private IDeckManager deckManager; 

    @Autowired 
    public PlayerManager(IDeckManager deckManager) { 
     this.deckManager = deckManager; 
    } 

    public void doSomething() { 
     this.deckManager.drawCard(); 
    } 
} 

春天会造成你DeckManager,请注意PlayerManager需要一个人来创建,通过构造方法注入它。

编程以这种方式,优选在PlayerManager创建DeckManager的实例,因为它创建松散耦合代码哪一个更容易测试(除其他好处)。

+0

你忘了在'PlayerManager'中声明'deckManager'; –

+1

鹰眼!固定 – bm1729

1

你可能会被使用Singleton模式。无论如何,如果你一定要这样做,但也有其他选择。

考虑创建一个新的类,它为您的相互作用。当你意识到这个对象有一个自然的名字时,你会知道你做的是正确的事情。

在这里,我创建了一个名为Game新的类,它应该让你做,他们是合适的相互作用。现在注意我们可以同时有多个Game发生。

class Player { 

} 

class Deck { 

    private void shuffle() { 

    } 

} 

class PlayerManager { 

    final Collection<Player> players; 

    public PlayerManager(Collection<Player> players) { 
     this.players = players; 
    } 

    private Collection<Player> getPlayers() { 
     return players; 
    } 
} 

class DeckManager { 

    final Collection<Deck> decks; 

    public DeckManager(Collection<Deck> decks) { 
     this.decks = decks; 
    } 

    private void shuffle() { 
     for (Deck deck : decks) { 
      deck.shuffle(); 
     } 
    } 

    private void deal(Collection<Player> players) { 

    } 
} 

class Game { 

    final PlayerManager players; 
    final DeckManager decks; 

    public Game() { 
     players = new PlayerManager(makePlayers()); 
     decks = new DeckManager(makeDecks()); 
    } 

    private Collection makePlayers() { 
     return null; 
    } 

    private Collection<Deck> makeDecks() { 
     return null; 
    } 

    public void shuffleAndDeal() { 
     // Shuff all decks. 
     decks.shuffle(); 
     // Deal to players. 
     decks.deal(players.getPlayers()); 
    } 
}