2014-01-30 28 views
1

我想模拟一个有很多服务器(例如生产服务器,与ProdServer类关联)的域。每个服务器都继承Server类中的某些内容。每个服务器都有一个关联的数据库列表(类Database),所以服务器总是知道它的数据库。每个数据库应该知道一些关于托管服务器的信息。服务器类有数据库,数据库类需要了解有关服务器

据我知道,我会风格的组成协会ServerDatabase之间的关系,因为每个服务器拥有数据库和数据库不无相关的服务器存在了(也许不是?)。

enter image description here

这是怎么了,我称呼这种情况。我错了吗?我怎样才能改进这种设计?

  • 将组合关联视为一个组合关联是错误的吗?
  • 通过这种方式,我拥有了一个可见性的循环。在Database类中,我可以看到Server类,在Server类中,我可以无限期地看到由该服务器等托管的所有数据库(请参阅图像)。

enter image description here

+0

这个问题似乎是题外话,因为它应该属于http://codereview.stackexchange.com/ –

+0

为什么会Database类需要了解服务器的东西吗? – Bart

+0

导致每个数据库都有(后台)关联的日志文件(Database <> ----> Logfile),并且在这个日志中需要服务器信息。这是错的吗? –

回答

1

我会想办法让服务器 - > DB关系的一种方式链接。服务器知道数据库,但不是相反。从您的评论中可以看出,Database有Logfile,而Logfile又需要一些关于Server的信息,这就是为什么引用服务器“泄漏”到DB中的原因。 将日志文件需要的信息提取到单独的实体X中,并在实例化时将其传递到数据库。注意你如何区分顾虑 - 服务器有X,DB有LogFile,它知道X,但DB对服务器本身一无所知。

private interface Server{ 
    public String getFriendlyName(); 
    public String getMachineNameName(); 
    public Set<Database> getDatabases(); 
    public void createDatabase(String name); 
} 

private class ProdServer implements Server{ 
    private StuffThatLogfileNeeds stuffThatLogfileNeeds; 
    private HashSet<Database> dbs = new HashSet<Database>(); 

    private ProdServer() { 
     stuffThatLogfileNeeds = new StuffThatLogfileNeeds("bla bla"); 
    } 

    @Override 
    public String getFriendlyName() { 
     throw new RuntimeException("Not implemented yet"); 
    } 

    @Override 
    public String getMachineNameName() { 
     throw new RuntimeException("Not implemented yet"); 
    } 

    @Override 
    public Set<Database> getDatabases() { 
     return new HashSet<Database>(dbs); 
    } 

    @Override 
    public void createDatabase(String name) { 
     Database database = new Database(name, stuffThatLogfileNeeds); 
     dbs.add(database); 
    } 
} 

private class Database{ 
    private String name; 
    private StuffThatLogfileNeeds stuffThatLogfileNeeds; 

    public Database(String name, StuffThatLogfileNeeds stuffThatLogfileNeeds) { 
     this.name = name; 
     this.stuffThatLogfileNeeds = stuffThatLogfileNeeds; 
    } 

    public String getName(){ 
     throw new RuntimeException("Not implemented yet"); 
    } 
} 

private class StuffThatLogfileNeeds{ 
    private String foo; 

    private StuffThatLogfileNeeds(String foo) { 
     this.foo = foo; 
    } 

    public String getFoo() { 
     return foo; 
    } 
} 
+0

你有没有一个例子说明你是在什么时间传递的? –

+1

更新了答案 –

+0

StuffThatLogfile需要服务器和数据库组成之间的关联类吗?例如:http://www.ibm.com/developerworks/rational/library/content/RationalEdge/sep04/bell/bell_fig11.jpg –

相关问题