我对Java很陌生,而且我已经在相当长的一段时间内努力解决以下问题了。
我的项目中有这个类'人',作为我模型的一部分,我希望我的人类能够专注并因此有新的行为。例如,我可以拥有一个以'公民'开头的人,但后来可以变成'士兵'并学习新的行为。
我曾经在Smalltalk中通过向我的'Human'类中添加一个实例变量来实现这一点,这将指向'Civil'的实例,这样我就可以在以后将其指向'Soldier'的新实例在游戏中,但现在在Java中我被限制为类型,我不知道如何解决它(我不认为为每种可能的类型添加一个实例变量可能是一个可能的解决方案,但我可能是错的)。
那么,你会如何模仿这个?任何关于如何解决这个问题的提示都将非常感激!
答案 0 :(得分:3)
您可以使用Composition而不是继承。因此,一个人在其中会有一个代表其行为的变量。你可以称之为HumanBehaviour。扩展HumanBehaviour并创建SoldierBehaviour和CivilBehaviour。因此,您可以随时更改实例行为。只需做一个myHuman.setBehaviour(new SoldierBehaviour())或myHuman.setBehaviour(new CivilBehaviour());
答案 1 :(得分:2)
class Human {
Job job = new Civil();
}
interface Job {
void work();
}
class Civil implements Job {
void work() {
cutDownTrees();
}
}
class Soldier implemets Job {
void work() {
lookForEnemies();
}
}
答案 2 :(得分:2)
您似乎需要Strategy design pattern。
在您的情况下,您应该创建一个Behaviour
接口,由类Civil
和Soldier
实现:
public interface Behavior {
void doSmthg();
}
public class Civil implements Behavior {
void doSmthg(){ /* do it like a civil! */ }
}
public class Soldier implements Behavior {
void doSmthg(){ /* do it like a soldier! */ }
}
public class Human {
private Behavior behavior = new Civil();
public void setBehavior(Behavior b) {
this.behavior = b;
}
}
答案 3 :(得分:1)
在这种情况下,设计模式很方便。
您正在寻找对象的动态扩展,Decorator模式可以帮助您处理它。其他简单的方法是通过战略模式来做,士兵将成为战略,民间将成为战略,你将其添加到人物对象,现在这个人将成为士兵或民间等。