我有一个可以喂狗或砍树的播放器。
下面是我写的类:
public class Dog {
private int health;
public void feed(Food food){
health = health + food.getNutritionalValue();
}
}
public class Player{
public void feed(Dog dog, Food food) {
dog.feed(food);
}
Player 和 Dog 都有“active” 的方法。
玩家喂狗,狗开始吃食物(我不确定以这种方式耦合方法是否好)。
另一方面,我有树。 玩家可以砍树。
公共(public)类播放器{
public void chop(Tree tree) {
//At this point I am not sure
}
我不确定我是否会使用 Tree 类的 getters 和 setters 来与树交互。
或者,如果我应该为此编写一个自己的方法,因为树被砍掉了,所以我会调用它。
所以,最终会有两种或更多种实现方式,但我想到的两种是:
tree.setAmountofWood = x
或
tree.gettingChopped(Damage int)
我想我应该为这个切碎过程制定一个自己的方法。
或者有什么设计原则是我应该遵循的?
最佳答案
我在这里看到 3 个原则,
- SRP - 树有责任被砍倒并倒下,但砍倒是人的责任!
- Demeter 定律 - 从我的 POV 来看很不错。
- OCP - 树木在被砍伐时必须能够执行进一步的操作。
所以你必须使用
tree.gettingChopped(Damage damage)
您的代码:
- 方法
Dog.feed
是错误的,重命名为Dog.eat
因为Dog 没有喂食,狗正在吃东西。顺便说一句,食物必须降低其营养值(value)。 - 健康是一个整数值,这很糟糕,因为在现实中没有什么比得上数字健康了。我们可能有一个以百分比为单位的残缺数值,但这更多的是一个不能为负值的字节。您应该为 Health 创建一个自定义类!通过这种方式,您的代码是开放的 (OCP) 扩展,例如被毒化或抑制。
关于java - 使用哪种设计模式(主动和被动方法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37524545/