Tôi đã đọc rất nhiều về các mẫu thiết kế, nhưng khi sử dụng các mẫu này, có một câu hỏi mà tôi tiếp tục quay trở lại. Làm thế nào các thực thể của tôi nên truy cập thông tin về nhau?
Giả sử tôi đang sử dụng một mẫu đơn giản trong đó mỗi đối tượng cập nhật và tự vẽ:
class Monster extends GameEntity {
public void update(double delta) {}
public void draw(Graphics g) {}
}
Tôi đang viết vòng cập nhật của mình, nhưng tôi nhận ra rằng đối với Monster đòi hỏi kiến thức về vị trí của người chơi, nơi các thành phố trên bản đồ chính hoặc một số dữ liệu ngẫu nhiên khác.
Làm thế nào để Monster có được điều này? Tôi có khởi tạo nó với một tham chiếu đến mọi thứ có thể cần không?
class Monster extends GameEntity {
public Monster(Player player, City[] cityList) {
this.player = player;
this.cityList = cityList;
}
}
Trông có vẻ khá lộn xộn. Hay tôi có một Người quản lý chính, có quyền truy cập vào mọi thứ, và chuyển nó cho mọi thứ?
class Monster extends GameEntity {
public Monster(GiantGlobalManager manager) {
this.manager = manager;
}
public void update(double delta) {
cities = this.manager.getCities();
}
}
Hoặc có lẽ có người quản lý như singleton? Chúng tôi cũng có thể phá vỡ các nhà quản lý vào các lĩnh vực quan tâm của họ.
class Monster extends GameEntity {
public void update(double delta) {
cities = CityManager.getInstance().getCities();
player = PlayerManager.getInstance().getPlayer();
guiManager.getInstance().createMenu();
}
}
Nhưng điều này vẫn không cảm thấy hoàn toàn đúng. Bây giờ tôi phải duy trì tất cả các trình quản lý này và có vẻ như các đối tượng của tôi đã thực hiện tất cả các cuộc gọi tĩnh này. Thứ hai, nhiều đối tượng trong số này không nên có quyền truy cập vào mọi thứ được cung cấp bởi các lớp này. Để mọi thứ truy cập mọi thứ cảm thấy như một cảnh sát đối với tôi.
Bất cứ mẫu nào tôi đang sử dụng - cho dù tôi có phá vỡ các thực thể thành các thành phần hay chỉ di chuyển bản vẽ của mình và cập nhật các vòng lặp để tách các đối tượng - tôi vẫn cần một số cách để chúng giao tiếp. Một cách tốt để đi về điều này là gì? Tôi đang thiếu gì ở đây?
Tất cả điều này nên được thực hiện thông qua các sự kiện? Nhưng nhận được một danh sách các thành phố không thực sự là một sự kiện, nó chỉ là dữ liệu mà quái vật cần.