使用哪种设计模式(主动和被动方法)?

时间:2016-05-30 11:28:04

标签: java oop design-patterns

我有一个播放器可以提供或砍

以下是我写的课程:

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);
    }

播放器都有"有效" 的方法。

玩家喂狗,狗开始吃食物(我不确定以这种方式结合方法是否合适)。

另一方面,我有。并且玩家能够砍树。

public class Player {

public void chop(Tree tree) {
        //At this point I am not sure
    }

我不确定是否会使用类的 getters setters 来与树进行交互。

或者,如果我应该为此编写一个自己的方法,因为树被切断,所以它不会真正活跃我会打电话。

所以,最后,会有两种或更多种实现,但我想到的是:

tree.setAmountofWood = x

tree.gettingChopped(Damage int)

我想我应该为这个斩波过程制作一个自己的方法。

或者我应该遵循任何设计原则吗?

3 个答案:

答案 0 :(得分:1)

我会从这样的事情开始。

树会长大并受到伤害。

public class Tree {
    private int lumber;

    public Tree(int size) {
        this.lumber = size;
    }

    public void grow() {
        this.lumber++;
    }

    public void grow(int size) {
        this.lumber += size;
    }

    public int receiveDamage(int damage) {
        int lumber = 0;
        if (damage > this.lumber) {
            lumber = this.lumber;
            this.lumber = 0;
        } else {
            lumber = damage;
            this.lumber -= damage;
        }
        return lumber;
    }
}

食物只是储存营养价值。

public class Food {
    private int nutrition;

    public Food(int nutrition) {
        this.nutrition = nutrition;
    }

    public int getNutritionalValue() {
        return this.nutrition;
    }
} 

我不确定所有类型的玩家是否都可以砍树,所以我创建了一个分类责任的类。如果愿意,可以将方法移动到Player类。

public class Woodcutter extends Player {
    public int chop(Tree tree) {
        // lumber amount may depend on a tool,
        // i.e. axe, chainsaw, etc.
        return tree.receiveDamage(10);
    }

    // fell down the tree
    public int fell(Tree tree) {
        int result = 0;
        int lumber = 0;
        do {
            lumber = chop(tree);
            result += lumber;
        } while (lumber > 0);
        return result;
    }
}

代码中的某处

// create a tree and let it grow for a while
Tree tree = new Tree(10);
tree.grow(90);

// Start chopping
Woodcutter woodcutter = new Woodcutter();
System.out.println("Lumber received: " + woodcutter.chop(tree));
System.out.println("Lumber received: " + woodcutter.fell(tree));

Dog dog = new Dog();
Food food = new Food(5);
woodcutter.feed(dog, food);

答案 1 :(得分:1)

我不会在这里深入研究被动/主动方法。一个活跃的树'可能确实是用词不当。

我宁愿考虑将对象的方法称为将消息传递给对象。而且您显然需要将消息发送到当前正被某人剪切的树中,并让树决定何时例如fall()bend()shake()

树有一些内部状态(strengththickness的主干?health?)。 &#39;发送消息&#39;树的意思是调用它的方法,例如, beingCut(),这反过来又恶化了树的状态。在树的状态达到一定限度之后,其他动作(=树的坏状态的结果)可能由<树> 启动。

当然,正如在你的主循环的每次迭代中,你的树也有机会将消息发送到grow(),所以它的状态每次都会有所改善,所以最终它甚至可能从仅被部分切割中恢复并恢复其初始完美状态。

所以,是的,虽然树木似乎相当被动,但它们仍然会对信息/刺激作出反应。 : - )

答案 2 :(得分:1)

我在这里看到3条原则,

  1. SRP - 树的责任是被切断并摔倒,但切割是人的责任!
  2. 得墨忒耳定律 - 从我的POV看起来不错。
  3. OCP - 树在切割时必须能够做进一步的操作。
  4. 所以你必须使用

    tree.gettingChopped(Damage damage)
    

    致你的代码:

    1. 方法Dog.feed错误,将其重命名为Dog.eat,因为狗没有喂食,狗正在吃。顺便说一句,食物必须减少其 NutritionalValue
    2. 健康是一个整数值,这很糟糕,因为实际上没有数字健康。我们可能有百分比的残疾数字值,但这更像是一个不能负值的字节。您应该为Health创建一个自定义类!通过这种方式,您的代码是开放的(OCP),用于扩展,例如中毒或侮辱。