情况如下:
我们有一个游戏,其中有玩家和物品。当玩家拥有库存中的所有3个特定物品并进行组装(地图上每个物品只有1个)时,便会赢得比赛。物品具有非常简单的界面,玩家可以在其上调用use()
。如果我要忽略基本的OOP原则,我可以说,当玩家使用其中的一种时,我们将遍历玩家的库存,并检查其中是否包含所有这三种特定类型的物品。如何避免这样做?
public interface Item{
public void use();
}
public class SpecificItem1 implements Item{
public void use(){...}
}
public class SpecificItem2 implements Item{
public void use(){...}
}
public class SpecificItem3 implements Item{
public void use(){...}
}
public class Player{
ArrayList<Item> inventory;
public void didWeWin() {
int numOfSItems = 0;
for(Item i : inventory) {
if(i instanceOf SpecificItem1)
numOfSItems++;
if(i instanceOf SpecificItem2)
numOfSItems++;
if(i instanceOf SpecificItem3)
numOfSItems++;
}
if(numOfSItems == 3)
win();
}
}
public void didWeWin() {
if (inventory.stream().map(Object::getClass).distinct().count() == 3L) {
win();
}
}