2014-10-16 64 views
2

这感觉就像这样一个基本的问题,但这是所有新的给我:的Java:复制的方法

我有一个Person和房类,它们都有项目对象的列表。

public class Person{ 
    private ArrayList<Item> items; 

    public Person() { 
    items = new ArrayList<>(); 
    } 

    public void addItem(){ 
    ... 
    } 

    public void removeItem(){ 
    ... 
    } 

}  

public class Room { 

    private ArrayList<Item> items; 

    public Room() { 
    items = new ArrayList<>(); 
    } 

    public void addItem(){ 
    ... 
    } 

    public void removeItem(){ 
    ... 
    } 

} 

项目方法例如addItem()被复制在Room类和Person类中,这不是很好。我考虑制作一个单独的库存类,其中包含物品和物品方法列表,然后每个房间和人员都有库存。

但后来我就没法如果我使用一个私人库存外地调用从一个人或房项目的方法。

什么是停在这里重复的最好方法?提前致谢!

+2

您可以在委托给清单对象的Person和Room类中创建适当的方法。 – 2014-10-16 21:09:58

+0

您的解决方案似乎是正确的方法。我会说你尝试实现总体设计模式。也许这些thougts帮助一点点:http://commons.oreilly.com/wiki/index.php/Use_the_Aggregate_Design_Pattern_to_Reduce_Coupling – 2014-10-16 21:30:54

回答

7

你说得对。制作单独的库存类将是一个很好的面向对象设计。

我很高兴你没有说让父类成为RoomPerson,因为虽然这样可以为你节省重复,但房间和人的关系并不相关,所以它们不应该在面向对象的意义上相关无论是。

您可以使用代表团委派添加/删除项目的Inventory领域。

public class Room { 

    private Inventory inventory = new Inventory(); 

    public void addItem(Item item) { 
     inventory.addItem(item); 
    } 

    public void removeItem(Item item) { 
     inventory.removeItem(item); 
    } 
} 

编辑

有人提议露出库存,然后有一个公共的添加/删除对person.getInventory().addItem(item)方法。我认为,这将违反Law of Demeter

+1

+1。关于你的“编辑”:我认为这取决于实际的域名,不管这是否违规。 “给我你的库存,并让我添加/删除项目”可能是在某些领域的语义上正确的操作,而在其他领域,它不会。对于初学者来说,一个好的测试可能会问:“人”是否有*库存?或者是否恰好在内部使用? – 5gon12eder 2014-10-16 21:22:55

+0

谢谢!我想过这样做,但想知道是否还有其他方法。但现在我认为你的方式可能是最好的。 – mmgro27 2014-10-16 21:24:16

0

我认为库存班是去这里最好的方法。您可以通过为PersonRoom内的库存创建一个吸气剂来使用物品方法。

+0

这似乎不是一个很好的解决方案给我。以这种方式使用吸气剂是个好主意吗? – mmgro27 2014-10-16 21:13:06

+1

您可以像其他人所建议的那样使用委托方法,但我没有看到使用清单的问题。库存类将有一个私有的'ArrayList'和用于添加和移除项目的公共方法。 – dramzy 2014-10-16 21:15:18

+0

通过不使用getter并委托给Person或Room类,您可以更好地封装,因为您没有透露有关项目如何存储到调用者的详细信息。 – Mark 2014-10-16 21:16:45

0

根据您的业务领域是什么,你可以有一个抽象的存储容器类太多,他们都继承。抽象存储容器上会有方法,所以你仍然可以直接调用它们。

你也可以给这两个类IStorageContainer的空白界面,然后创建与参加了IStorageContainer的第一个参数一个静态方法一个新的静态类。

然后,你可以调用的AddItem(thisPerson,项目)和removeItem(thisPerson,项目),但能够重用这两个类这两种方法,使用相同的代码和实施。