2012-04-04 11 views
2

Dies ist ein Beispiel für Decorator Pattern.
ist Dekorator-Muster wie Calling Super-Methode?

public class Computer { 
public String Description(){ 
    return "Computer"; 
} 
} 

public abstract class Decorator extends Computer{ 
public abstract String description(); 
} 

public class Monitor extends Decorator{ 

Computer computer; 
public Monitor(Computer c){ 
    computer = c; 
} 

public String description() { 
    return computer.Description() + " and Monitor"; 
} 
} 

public class main { 
public static void main(String args[]){ 
    Computer c = new Computer(); 
    Monitor m = new Monitor(c); 
    System.out.println(m.description()); 
} 
} 

Ist das das gleiche mit Super-Methode der Superklasse aufrufen ?? wie wenn der Monitor vom Computer geerbt wurde und dann die super.Description() in der Computerklasse innerhalb der Description-Methode in der Monitor-Klasse aufgerufen wurde?

Antwort

5

Mit dem Aufruf der Super-Methode müssen Sie für jede Möglichkeit eine neue Unterklasse erstellen. Zum Beispiel: Was ist, wenn Sie einen Computer mit einem Monitor und einer Maus möchten? Sie können eine Unterklasse erstellen, die Monitor erbt. Jetzt sagen Sie, dass Sie einen Computer ohne einen Monitor und mit einer Maus wollen. Sie benötigen auch eine andere Unterklasse, die Computer erbt. Es gibt nur zwei Geräte, und Sie benötigen bereits drei Unterklassen (Monitor, und MonitorAndMouse). Was ist, wenn Ihr Computer auch einen Drucker, einen Scanner und eine Reihe von Lautsprechern haben kann?

Mit dem Decorator-Muster können Sie den Computer mit einem neuen Gerät dekorieren. Wie bei der Monitor können Sie für jedes Gerät einen anderen Decorator erstellen. Um einen Computer mit allen Geräten zu erstellen, können Sie jetzt etwas tun, wie

Computer = new Speakers(
    new Scanner(
     new Printer(
      new Mouse(
       new Monitor(
        new Computer() 
       ) 
      ) 
     ) 
    ) 
); 
computer.description(); 

Jetzt description() kehrt Computer and Monitor and Mouse and Printer and Scanner and Speakers. Sie können die Geräte mit dem Computer mischen und abgleichen, ohne dass für jede Kombination eine neue Unterklasse erstellt werden muss.

Auf Kommentar:

wie etwa in meinem Beispiel ich die Dekorateur Klasse entfernen Sie überwachen nur knapp sein Ziel von Computer-Klasse erbt, sondern nur, dass ich Instanz von Computer-Klasse in der Monitor-Klasse setzt dann das gleiche tun.

Auf diese Weise können Sie nur eine Ebene tiefer gehen, Sie können nur ein Gerät zu einem Computer hinzufügen. Im Wesentlichen ist es ein nicht erweiterbarer Dekorateur. Das Decorator-Muster ist ein Weg zu favor composition over inheritance, wegen der immensen Zunahme von Möglichkeiten, die Sie beim Hinzufügen mehrerer Geräte bekommen. Mit Ihrer Lösung bevorzugen Sie die Komposition über die Vererbung, indem Sie keine Unterklasse der Computer erstellen, sondern die Monitor mit einer Computer. Es ist fast ein Dekorationsmuster, nur du hast einen Schritt zurück gemacht.

+0

Wie in meinem Beispiel, ich entferne die Dekorator-Klasse dann Monitor nicht von der Computerklasse geerbt, stattdessen ich nur Instanz der Computer-Klasse innerhalb der Monitor-Klasse dann tun Sie das gleiche. – user1293258

1

Um Ihre Frage kurz zu beantworten: Nein, es ist nicht das Gleiche.

Ein Decorator verwendet ein vorhandenes Objekt, um das Verhalten zu ändern, aber für die Außenwelt sieht es so aus, als wäre es ein Typ der Klasse, die es schmückt.

Um dies in Ihrem Beispiel zu erklären, haben Sie einen Computer und Ihr Computer hat einige Eigenschaften. Irgendwo in Ihrem Code erstellen Sie eine Instanz dieses Computers. Sie füllen es mit allen benötigten Daten.

Jetzt kommt der Decorator an Ort und Stelle. Sie benötigen eine Klasse, die diese Instanz des gerade erstellten Computers schmückt! Genau dieser.

Ich werde Ihren Computer übernehmen und eine Methode hinzufügen, um sie auszuschalten und auf

public class Computer { 
    private boolean isOn = true; 
    private String description = "Computer";   

    public vod turnOn(){ 
     this.isOn=true; 
    } 

    public void turnOff(){ 
     this.isOn = false; 
    } 

    public void setDescription(String description){ 
     this.description = description; 
    } 

    public String Description(){ 
     return this.description; 
    } 
} 

Jetzt ein Dekorateur erschaffe ich, wo Sie Ihren Computer nicht ausschalten.

public class ComputerDecorator1 extends Computer { 
    private Computer computer; 

    public ComputerDecorator1(Computer computer){ 
     this.computer = computer; 
    } 

    public vod turnOn(){ 
     this.computer.turnOn(); 
    } 

    public void turnOff(){ 
     System.out.println("You cannot turn me off!!!!"); 
    } 

    public void setDescription(String description){ 
     this.computer.setDescrition(descritption); 
    } 

    public String Description(){ 
     return this.computer.Description(); 
    } 
} 

Wie Sie sehen können, müssen Sie ihm eine Computerinstanz im Konstruktor geben. Dies ist der Computer, den wir dekorieren. Jeder Methodenaufruf wird an diese Klasse weitergegeben. Normalerweise müssen Sie alle Methoden überschreiben und an das dekorierte Objekt übergeben. In diesem Fall der Computer.

Sie können dies verwenden, um das Verhalten eines Objekts zu ändern, ohne eine neue Klasse davon zu erstellen. Der Vorteil ist, dass wenn Sie eine Instanz eines Computers von woanders bekommen, Sie diesen Filter hinzufügen können, so dass der Rest Ihres Programms es nicht ausschalten kann. Diese

ist, wie Sie ein Dekorateur in Ihrem Programm verwenden:

public void getMyComputerAndTurnItOff(){ 
    Computer myComputer = getMyComputer(); 
    myComputer.turnOff(); 
} 

public Computer getMyComputer(){ 
    //Here you will load a Computer from an other class 
    Computer computer = this.otherClass.loadComputerFromDB(); 

    //Now we could return it, but what if you shouldn't be able to turn it off? 
    //easy add our decorator 
    return new ComputerDecorator1(computer); 
} 

Wenn Sie einen Ausstatter verwenden möchten, müssen Sie das Verhalten ändern, sonst ist es sinnlos ist! In Ihrem Beispiel mit Computer und Monitor von einem logischen Punkt aus kann ein Monitor kein Dekorator für einen Computer sein. Für mich sind das zwei verschiedene Objekte.

Ich hoffe, ich könnte es ein bisschen klarer machen, was ein Dekorateur ist!