如果每个对象在Java中的行为不同,则实现类的最佳实践

Fog*_*ert 0 java oop design-patterns

我们来看一个现实世界的例子吧.

假设,我有三只狗,但一只狗可能与另一只狗不同.
第一只狗喜欢吠叫和吃东西,第二只狗喜欢玩耍和追逐猫,第三只狗喜欢跑步和慢跑(将这些动作视为方法).

我如何在Java中实现它?我必须使用什么,最佳做法是什么?抽象类,接口或它们两者?

Str*_*lok 8

我将它实现为使用单个Dog类和组合 behaviours

public interface Behaviour { void action(); }

public class Bark implements Behaviour {...}
public class ChaseCat implements Behaviour { ... }
public class Eat implements Behaviour {...}
public class Sleep implements Behaviour {...}
... others
public class Dog {

  private List<Behaviour> behaviours;

  public Dog(Behaviour...behaviors) { this.behaviors = Arrays.asList(behaviours); }

  public void play() { 
   // choose random behaviour
   behaviour.action();
  }
}

Dog dog1 = new Dog(new ChaseCat(), new Bark());
Dog dog2 = new Dog(new Eat(), new Sleep());
Run Code Online (Sandbox Code Playgroud)

这种方法的好处是,如果您公开管理Dog类行为的方法,您甚至可以在应用程序运行时修改行为.例如,如果一只猫吓到一只狗你可以有一种方法来消除这种行为一段时间,你的狗不会这样做.然后你可以稍后添加它.你明白了.