4

私は持っている

public class mammal implements Imammle
{

    public String getName() {
        return "Mammal";
    }

    public String speak() {
        return getName() +  "Maaaauuu";
    }

}

飼料を食べるなどの対応するアクションをリアルタイムで実行できるように、動物がいつ音を出すかを知る必要があります。
どのようなデザインパターンを使用すればよいですか? ありがとう。

4

1 に答える 1

8

Observer設計パターンを使用して、問題を解決できる可能性がありますオブザーバー パターンには、2 つの異なるタイプのオブジェクトがあります。

  1. オブザーバーオブジェクトは、Observable オブジェクトが変更されるたびに通知が必要なオブジェクトです。
  2. 監視可能なオブジェクトは、オブザーバーが監視できるオブジェクトです

オブザーバーは、監視したいObservableオブジェクトに登録されます。Observableオブジェクトが変更されるたびに、登録されているすべてのオブザーバーに通知されます。

コード例に基づいて、Java を使用していると仮定します。その場合、ObserverObservableを使用して、既存のコードに加えなければならない変更の数を減らすことができます。

public class mammal extends java.util.Observable implements Imammle
{

    public String getName() {
        return "Mammal";
    }

    public String speak() {
        setChanged(); // We have been changed
        notifyObservers(); // Notify everyone that we have changed
        return getName() +  "Maaaauuu";
    }

}

次に、何かが変更されたときに監視するクラスを作成します。

public class Watcher implements java.util.Observer
{
    public void update(Observable o, Object arg) {
        System.out.println("Something has changed");
    }
}

最後に、ウォッチャーを に登録して、ウォッチャーmammalが変更されるたびに通知できるようにします。

public class Main
{
    public static void main(String args[]) {
        mammal cow = new mammal();
        Watcher farmer = new Watcher();
        cow.addObserver(farmer);
        cow.speak();
    }
}

このアプローチにはいくつかの欠点があります。

  1. オブザーバーは、任意の Observable オブジェクトに登録できます。Observer が s のみを観察できるようにしたい場合がありますmammal。反対に、特定の種類のオブザーバーのみがmammal.
  2. なし Observerで正確に何が変わったのかを知る方法は本当にありませんmammal
    • notifyObservers(Object arg)メソッドmammalを使用して、ある種のメッセージを Observer に渡す
    • または、Observer が public フラグ セットをチェックします。mammal

これらの欠点のいずれかが問題になる場合は、回避ObserverObservable、既存のクラス (mammalおよびそれが何であれObservers) を変更して、独自のアプリケーション固有のメソッドを実装することを検討してください。

于 2012-04-10T04:46:59.507 に答える