对不起,这个问题的措辞有些奇怪,但我刚开始接触面向代理的思考方式(这些是“模式”吗?),对Java的了解也仅比新手稍多一点,我正为一个看似非常基础的问题而挣扎。
我更多的是在凭直觉(也就是盲目地)做这些,而不是试图理解别人的代码——部分原因是我难以理解那些“超出我水平”的代码,但也因为我希望按照“我的方式”做会帮助我后来更好地理解正确的方法。
基本上,我正在模拟一个环境中的代理(一个机器人吸尘器)。一个House包含一个房间集合(HashMap)。House有一个方法getRoom(int key)
,它返回与给定键匹配的房间。Agent有一个状态,目前它跟踪一个房间ID(这也是House中的键),这是机器人为了导航世界而“在”的房间;状态还描述了房间是否已知脏。当代理被构造时,它会用一个ID进行初始化(它必须在某个房间中创建),但不会给出房间的脏/clean状态。我希望代理可以检查脏物——这将涉及调用House中的getRoom()
方法。然而,根据我目前学到的Java知识,我不知道如何做到这一点。我知道我可以通过在Java中创建一个House来访问那个方法,或者通过使该方法成为静态的,但这些方法都不行——代理需要知道内存中那个特定的House,那个已经被房间初始化的House。
简而言之:一个Agent对象如何获得存储在另一个环境对象内部的HashMap中的对象的引用?
P.S. 这是我想象的这种方法启用的“更高层次”视角的模型:我有点直觉地希望代理完全负责自己的感知和行为,这样更高层次的代码看起来会更像这样:
agent.percieve() //代理检查它认为自己所在的房间是否有脏物并退出if (agent.gotDirt()) agent.clean() //如果在这个房间发现脏物,代理启动其清洁设备if (agent.gotDirt() == false) agent.move() //代理选择一个出口并离开房间
回答:
吸尘器(也就是你所说的“代理”,但为什么要这样命名,因为它实际上是一个吸尘器?)只需要一个它所属的House对象的引用:
// 构造一个HouseHouse house = new House(); // 省略:向房子中添加房间...// 为房子创建第一个吸尘器。给这个清洁器一个房子的引用VacuumCleaner vacuumCleaner = new VacuumCleaner(house);System.out(vacuumCleaner.isRoomClean(2)); // 打印false,因为房间2充满了脏物vacuumCleaner.cleanRoom(2);System.out(vacuumCleaner.isRoomClean(2)); // 打印true,因为吸尘器已经从房间2中清除了脏物// 现在让我们为同一个房子创建第二个吸尘器VacuumCleaner vacuumCleaner2 = new VacuumCleaner(house);System.out(vacuumCleaner2.isRoomClean(2)); // 打印true,因为房间2没有脏物:之前第一个吸尘器已经从房间中清除了脏物。
编辑
这是VacuumCleaner类的样子:
public class VacuumCleaner /** * 这个吸尘器清洁的房子 */ private House house; public VacuumCleaner(House houseToClean) { this.house = houseToClean; } public boolean isRoomDirty(int roomId) { // 在房子里找到房间,并查看它是否包含脏物 } public void cleanRoom(int roomId) { // 在房子里找到房间,并从中清除脏物 }}