2017-02-23 54 views
5

当我正在研究我的一个项目并且不得不使用很多嵌套对象时,当我想要设置一个实例变量时,我变得非常不确定我在Java中的结构设计来自上层对象的深度嵌套对象。这感觉就像我错过了对Java中结构化设计的基本理解。任何有识之士都会受到赞赏。java设计:子对象的重复方法

想象一下,我有一个具有嵌套子对象作为变量的逻辑结构的对象。例如:

Country 
    Capital 
    Palace 
     King 

如果我现在想从主客体(国家)设置在国王的私人字符串变量“nameOfKing”,我会在所有的上层阶级王来定义每个方法。所以像这样:

public class Country { 
    private Capital capital; 

    public void setNameOfKing(String n) { 
     capital.setNameOfKing(n); 
    } 
} 

public class Capital{ 
    private Palace palace; 

    public void setNameOfKing(String n) { 
     palace.setNameOfKing(n); 
    } 
} 

public class Palace{ 
    private King king; 

    public void setNameOfKing(String n) { 
     king.setNameOfKing(n); 
    } 
} 

public class King{ 
    private String nameOfKing; 

    public void setNameOfKing(String n) { 
     this.nameOfKing = n; 
    } 
} 

这样我可以拨打country.setNameOfKing(n);。现在如果你只有几个变量就没有问题,但如果King,Palace,Capital这两个类别都定义了许多其他变量和方法,并且所有这些变量都必须从国家调用,那该怎么办?如果Palace还包含其他类对象(如现在只是制作东西)ThroneRoom,Treasury,Queen等等......这将意味着对于子类中的几乎所有方法而言,必须存在于Country类中,这可能会可能意味着你必须创建大量的方法来简单地将信息传递给导致非常大的Country类的子对象。

现在我想你可以在技术上说国王也可以在国家自己定义,废除宫殿和资本中的额外方法,但它仍然意味着方法必须存在于Country类中,如果这种结构在逻辑分组时是有意义的,那么最好的办法是什么?我不确定是否有更好的方法,但我不能动摇我在这里错过的东西。

+0

so'getPalace()。setFoo()'不是一个选项? –

+0

所以你的意思是像这样改变Country类的方法? 'capital.getPalace()。setNameOfKing(n);'这将改变你可能在Country类中有很多方法的事实 – lokipoki

回答

4

这是一个责任问题。

问问自己:“谁负责了解国王是谁?”。当你是宫殿的时候,你对国王负责吗?很明显不是。国王不是由你的宫殿管理的,但他依法依附于你的国家。

查询palace.setNameOfKing()类似于要求你的房子给你的新生儿起一个名字。你的房子没有这种响应能力,不应该被允许这样做。

正确的方法是检索King实例,并直接设置其名称。


现在有这种方法的一个问题:您可能需要使用许多干将找到King实例。但是,您可以使用类的功能方法来解决此问题。

palace.getOwner()可以返回接口OwnerKing implements Owner

相同的规则可以应用于其他类。

+2

是的,这是一个责任问题,我会更进一步,甚至不允许设置国王的名字从理论上到处都是通过提供公共设置方法。 –