2012-04-13 15 views
9

Ich bin neue Muster zu entwerfen, und ich war zu Druck Zahlen von 1 bis 10 unter Verwendung von Dekorateur Mustern gefragt. Es tut mir leid, wenn das trivial ist, aber ich muss lernen. Das ist, was ich habe, so weit:Sehr einfache Verwendung von Dekorateur Mustern Zahlen zu erzeugen

Schnittstelle

public interface NextNumber { 
    public int getNextNumber(int n); 
} 

Abstrakte Klasse

abstract public class PrintNumbers implements NextNumber { 
    protected final NextNumber next; 
    protected int num; 

    public PrintNumbers(NextNumber next, int num) 
    { 
     this.next = next; 
     this.num = num; 
    } 

    public int getNextNumber(int num) 
    { 
     return num+1; 
    } 
} 

DecoratorClass

public class DecoratorCount extends PrintNumbers { 
    public DecoratorCount(NextNumber next, int num) 
    { 
     super(next, num); 
    } 

    public static void main(String[] args) 
    { 
     int i = 0; 
    } 
} 

Ich bin mir nicht sicher, wie ich vorgehen soll oder ob ich den richtigen Weg gehe. Könnte jemand etwas Licht abwerfen?

+1

vielleicht hier http://en.wikipedia.org/wiki/Decorator_pattern? Es gibt eine ziemlich gute Beispielcode. – dhblah

+1

Wie möchten Sie Ihre 'PrintNumbers' Klasse dekorieren? – dash1e

+0

@gasan: Ja, ich sah das Beispiel Kaffee und kam mit meiner Version des Codes. Die Sache ist, ich bin mir nicht sicher, wie es funktionieren soll. Ich weiß, dass es verwendet wird, um Objekte dynamisch zu aktualisieren, aber ein klareres Bild benötigt. – noMAD

Antwort

6

Zuerst wird der Dekorateur-Klasse muss nicht die Klasse erweitern, die schmückt, sondern implementiert die gleiche Schnittstelle.

Schauen Sie sich das Wikipedia page.

So können Sie Ihren Dekorateur wie dies korrigieren:

// The interface 
public interface NextNumber { 

    public int getNextNumber(); 
} 

// The class to decorate 
public class PrintNumbers implements NextNumber { 

    protected int num; 

    public PrintNumbers(int startFrom) 
    { 
     this.num = startFrom; 
    } 

    public int getNextNumber() 
    { 
     return num++; 
    } 
} 

// The abstract decorator 
public abstract class DecoratorCount implements NextNumber { 

    private PrintNumbers pn; 

    public DecoratorCount(PrintNumbers pn) 
    { 
     this.pn = pn; 
    } 
} 

Dann zum Beispiel Sie Zahl von 2.

public class DoubleDecoratorCount extends DecoratorCount { 

    public DecoratorCount(PrintNumbers pn) 
    { 
     super(pn); 
    } 

    public int getNextNumber() 
    {  
     return pn.getNextNumber() * 2; 
    } 
} 

vermehren Und Sie können

public class Test { 

    public static void main (String[] args) { 
     PrintNumbers pn = new PrintNumbers(0); 
     DoubleDecoratorCount decorator = new DoubleDecoratorCount(pn); 
     for (int i = 0 ; i < 5 ; ++i) 
      System.out.println("value: " + decorator.getNextNumber()); 
    } 
} 
auf diese Weise Dekorateur testen

An dieser Stelle können Sie alle Dekorateure schreiben Sie benötigen:

  • von 3 Zu multiplizieren;
  • Um Ergebnisse in Buchstaben zu schreiben;
  • Um Ergebnisse in hex zu schreiben;
  • Etc ...
+0

Danke dafür.Ich sehe, du hast den abstrakten Dekorateur und die Klasse, um sie separat zu dekorieren. Nun rufe ich im 'DoubleDecorateeCount'' main() 'auf? – noMAD

+0

Besser Sie legen die 'main()' in eine separate Klasse. Ich habe gerade die Antwort mit einer Probe aktualisiert. – dash1e

3

Zuerst brauchen Sie etwas, das etwas Dekoration benötigen könnte, dann brauchen Sie einen Dekorateur für diese etwas. Beide Klassen, die Basisklasse und der Decorator, sind konkrete Klassen und können direkt verwendet werden.

einen Zähler von 1 bis 10 Dekorieren macht nicht viel Sinn machen (die Zahlen sind immer schön;)). Aber Sie könnten eine Basisklasse implementieren, die die Zahlen unformatiert ausgibt und dann einen Dekorator implementiert, der dem gedruckten Ergebnis etwas Schönheit verleiht.

+0

Dies gab mir ein besseres Verständnis dafür, warum wir dieses Muster verwenden. Vielen Dank :) – noMAD