2017-07-04 11 views
0

実際の例を考えてみましょう。すべてのオブジェクトがJavaで異なる動作をする場合、クラスを実装するためのベストプラクティス

私は3匹の犬を飼っていますが、1匹の犬は他とは異なる場合があります。
最初の犬は吠えと食べるのが好きで、2番目の犬は遊んで猫を追いかけるのが好きで、3番目の犬は走りとジョギングが好きです(これらの行動を方法と考えてください)。

これをJavaで実装するにはどうすればよいですか?私は何を使用しなければなりません、ベストプラクティスは何ですか?抽象クラス、インタフェース、またはその両方

+0

共通点は何ですか? – shmosel

+0

@shmoselいいえ、彼らは共通の方法を共有していません。 –

+0

それでは、なぜあなたはそれらを一般的なタイプに合わせようとしますか? – shmosel

答えて

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

のための単一Dogクラスおよび組成物を用いてこれを実装したいですアプリケーションが動作しているときの動作例えば、猫が犬を恐れている場合、しばらくその行動を取り除く方法があり、犬はそれをしません。その後、後で追加することができます。あなたはポイントを得る。

+1

[戦略パターン](https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm)の良い実装。 –

+0

この種のアプローチは私にとっては良いようです、ありがとう! –

-2
// Common interface. i.e. All dogs should be capable of barking! 
public interface iDog { 
    public void bark(); 
} 

// Common definition. i.e. All dogs bark like this unless specified otherwise 
public abstract class Dog implements iDog { 
    public void bark() { 
     System.out.println("Woof!"); 
    } 
} 

// Concrete Dog 1. Special type of bark, and eats. 
public class BarkingEatingDog extends Dog { 
    public void bark() { 
     System.out.println("Big Woof!"); 
    } 

    private void eating() { 
     System.out.println("Yum!"); 
    } 
} 

// Concrete Dog 2. Plays and chases cats. 
public class PlayingCatChasingDog extends Dog { 
    public void play() { 
     System.out.println("Playing!"); 
    } 

    private void chaseCats() { 
     System.out.println("GET OUT OF HERE STUPID CAT!"); 
    } 
} 

// Concrete Dog 3. Runs, jogs and barks differently 
public class RunningJoggingDog extends Dog { 
    public void run() { 
     System.out.println("Running!"); 
    } 

    private void jog() { 
     System.out.println("Jogging!"); 
    } 

    public void bark() { 
     System.out.println("Barkety Bark Bark!"); 
    } 
} 
+0

あなたの犬がこれらのものすべてをしたい場合はどうなりますか?あなたは永遠に新しい犬のクラスを書くでしょう。あなたの犬が突然猫が怖がって猫を追うのが好きでない場合はどうでしょうか?もう行動を変えることはできません。 – Strelok

+0

私は犬のオブジェクトを作成したいときに毎回新しいクラスを作成したくありません –

関連する問題