2016-05-30 1 views
3

У меня есть плеер, который может кормить собака или нарезать a дерево.Какой шаблон дизайна использовать (активные и пассивные методы)?

Ниже перечислены классы, которые я написал:

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.setAmountofWood = x 

или

tree.gettingChopped(Damage int) 

Я думаю, что я должен сделать самостоятельно метод для этого рубительный процесс.

Или есть какой-либо принцип дизайна, которому я должен следовать?

ответ

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

Я бы не погружаться в пассивные/активные методы здесь. «Активное дерево» действительно может быть неправильным.

Я бы предпочел обратиться к методу объекта, передав сообщение . И вам, видимо, необходимо отправить сообщение на дерево, которое оно сейчас разрезает кем-то, и разрешить дереву решить, когда, например, fall() или до bend(), или до shake().

Дерево имеет некоторое внутреннее состояние (strength? thickness его ствола? health?). 'Отправка сообщения ' в дерево означает вызов его метода, например. beingCut(), что, в свою очередь, ухудшает состояние дерева. После того, как состояние дерева достигнет определенного предела, другие действия (= последствия плохого состояния дерева) могут быть , начинающиеся с дерева.

Конечно, как и на каждой итерации вашей основной петли, у вас также есть возможность получить сообщение до grow(), поэтому его состояние может немного улучшиться каждый раз, поэтому в конечном итоге оно может даже восстановиться, если его частично отрезать и достичь своего первоначального, идеального состояния назад.

Итак, да, хотя деревья кажутся довольно пассивными, они по-прежнему реагируют на сообщения/стимулы. :-)

+0

Как бы вы реализовали эти передачи сообщений объекту? – user2742409

1

Я вижу 3 принципа здесь,

  1. SRP - это ответственность Древа, чтобы рубленые и упасть, но сократить это ответственность лица!
  2. Закон Деметры - хорошо выглядит из моего POV.
  3. OCP - Дерево должно быть в состоянии делать дальнейшие действия, когда обрезается.

Таким образом, вы должны использовать

tree.gettingChopped(Damage damage) 

К вашей коде:

  1. Метод Dog.feed неправильно, переименовать его в Dog.eat потому что собака не питается, собака ест. Кстати, пища должна уменьшить ее NutritionalValue.
  2. Здоровье - это целочисленное значение, это плохо, потому что на самом деле нет ничего похожего на числовое здоровье. У нас может быть отрицательное числовое значение в процентах, но это больше байт, который не может быть отрицательным. Вы должны создать собственный класс для Здоровья! Таким образом, ваш код открыт (OCP) для расширений, таких как токсичность или лишение свободы.
Смежные вопросы