2012-04-09 20 views
1

Ich habeBeobachter? Entwurfsmuster

public class mammal implements Imammle 
{ 

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

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

} 

Ich muss wissen, wenn mein Tier ein Geräusch macht, so dass ich entsprechende Aktionen in Echtzeit erfolgen kann wie Futter essen.
Welche Art von Entwurfsmuster sollte ich verwenden? Danke.

+0

Bitte umformulieren Sie Ihre Frage, da sie nicht klar war. – Phani

+0

Ich sehe Antwort auf Ihre Frage im Titel – mishadoff

Antwort

3

Das Observer Entwurfsmuster könnte möglicherweise verwendet werden, um Ihr Problem zu lösen. Im Observer Muster, gibt es zwei verschiedene Arten von Objekten:

  1. Observer Objekte sind Objekte, die benachrichtigt werden möchten, wenn beobachtbare Objekte ändern.
  2. beobachtbare Objekte sind Objekte, die durch Beobachter angeschaut werden können

Beobachter registriert sind, mit den beobachtbare Objekte, die sie wünschen, zu beobachten. Jedes Mal, wenn sich ein Observable Objekt ändert, werden alle Observer benachrichtigt, die damit registriert wurden.

Basierend auf Ihrem Codebeispiel gehe ich davon aus, dass Sie Java verwenden. In diesem Fall können Sie Observer und Observable verwenden, um die Anzahl der Änderungen zu reduzieren, die Sie an Ihrem vorhandenen Code vornehmen müssen.

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"; 
    } 

} 

Nun erstellen wir eine Klasse, die für sehen wünscht, wenn sich etwas ändert:

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

Schließlich registrieren wir unsere Beobachter (n) mit einem mammal, damit sie informiert werden können, wenn sie sich ändert.

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

Es gibt eine Reihe von Unentschieden-backs zu diesem Ansatz:

  1. Beobachter mit jedem beobachtbare Objekt registriert werden können. Vielleicht möchten Sie, dass Ihr Beobachter nur mammal s beobachten kann. Auf der anderen Seite möchten Sie vielleicht, dass nur bestimmte Arten von Beobachtern eine mammal beobachten können.
  2. Es gibt wirklich keine Möglichkeit für Ihre Observer zu wissen, was genau mit dem mammal geändert, ohne
    • Die mammal in irgendeiner Art von Nachricht an den Observer Passieren der notifyObservers(Object arg) Methode
    • ODER dem Observer mit einer öffentlichen Überprüfung Flag gesetzt in der mammal

Wenn eine dieser Nachteile auf ein Problem für Sie sind, dann können Sie Observer vermeiden wollen und beobachtbare und schauen Sie in modify Ihre bestehenden Klassen (mammal und was auch immer Ihre Beobachter sind) zu implementieren, um ihre eigenen, anwendungsspezifischen Methoden zu implementieren.