有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个播放器,它可以喂或砍

以下是我写的课程:

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 void chop(Tree tree) {
        //At this point I am not sure
    }

我不确定是否会使用Tree类的gettersetter与树交互

或者,如果我应该为此编写一个自己的方法,因为树被砍掉了,所以它没有任何活动,我会调用它

因此,最终会有两种或两种以上的实现,但我想到的两种是:

tree.setAmountofWood = x

tree.gettingChopped(Damage int)

我想我应该为这个切碎过程制定一个自己的方法

或者我应该遵循什么设计原则


共 (3) 个答案

  1. # 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);
    
  2. # 2 楼答案

    我不会在这里深入探讨被动/主动方法。“活动树”可能确实是一个用词不当的词

    我宁愿调用一个对象的方法来传递一个<强>消息<强>对象。显然,您需要将消息发送到树,告诉它当前正在被某人切割,并让树决定何时进行切割,例如fall()bend(),或shake()

    树有一些内部状态(strengththickness其主干?health?)向树发送消息”意味着调用其方法,例如^{,这反过来会恶化树的状态。在树的状态达到某个限制后,树可能会启动其他操作(=树的坏状态的后果)

    当然,在主循环的每一次迭代中,树也有机会将消息发送到^{,因此它的状态每次都可能会有所改善,因此最终甚至可能会从仅被部分切割恢复到最初的完美状态

    所以,是的,虽然树木看起来相当被动,但它们仍然对信息/刺激做出反应。:-)

  3. # 3 楼答案

    我在这里看到三条原则

    1. SRP——被砍倒是树的责任,但砍倒是人的责任
    2. 德米特定律——从我的视角看很好
    3. OCP——树木在被砍伐时必须能够采取进一步的行动

    所以你必须使用

    tree.gettingChopped(Damage damage)
    

    您的代码:

    1. 方法Dog.feed是错误的,请将其重命名为Dog.eat,因为狗没有进食,狗正在进食。顺便说一句,食物必须降低其营养价值
    2. 健康是一个整数值,这是不好的,因为实际上没有什么比数字健康更好的了。我们可能有一个以百分比表示的残缺数字值,但这更像是一个字节,不可能是负值。你应该为健康创建一个自定义类!这样,您的代码对有毒或不受欢迎的扩展是开放的(OCP)