2012-08-22 15 views
12

ich Dekorateur sehen über example in Python:Decorator in Java

def makebold(fn): 
    def wrapped(): 
     return "<b>" + fn() + "</b>" 
    return wrapped 

def makeitalic(fn): 
    def wrapped(): 
     return "<i>" + fn() + "</i>" 
    return wrapped 

@makebold 
@makeitalic 
def hello(): 
    return "hello world" 

print hello() ## returns <b><i>hello world</i></b> 

und bekam einige neugierig wie es in Java implementiert werden, so dass ich suchen und habe einige Beispiel Decorator Design Pattern verwenden.

public class Main { 

    public static void main(String[] args) { 
     Wrapper word = new BoldWrapper(new ItalicWrapper()); 
     // display <b><i>hello world</i></b> 
     System.out.println(word.make("Hello World")); 
    } 
} 

public interface Wrapper { 

    public String make(String str); 

} 

public class BoldWrapper implements Wrapper { 

    private Wrapper wrapper; 

    public BoldWrapper() { 

    } 

    public BoldWrapper(Wrapper wrapper) { 
     this.wrapper = wrapper; 
    } 

    @Override 
    public String make(String str) { 
     if(wrapper != null) { 
      str = wrapper.make(str); 
     } 

     return "<b>" + str + "</b>"; 
    } 

} 

public class ItalicWrapper implements Wrapper { 

    private Wrapper wrapper; 

    public ItalicWrapper() { 

    } 

    public ItalicWrapper(Wrapper wrapper) { 
     this.wrapper = wrapper; 
    } 

    @Override 
    public String make(String str) { 
     if(wrapper != null) { 
      str = wrapper.make(str); 
     } 

     return "<i>" + str + "</i>"; 
    } 

} 

Wie kann ich dies wie das Python Beispiel machen eine Java Annotation oben mit wie diese:

public class Main { 
    public static void main(String[] args) { 
     @BoldWrapper 
     @ItalicWrapper 
     String str = "Hello World"; 
     // Display <b><i>Hello World</i></b> 
    } 
} 

public @interface BoldWrapper { 
    public void wrap() default "<b>" + str + "</b>"; 
} 

public @interface ItalicWrapper { 
    public void wrap() default "<i>" + str + "</i>"; 
} 

ich ein Problem habe, wenn ich die Probe zu machen versucht, ist das Problem, das ich weiß nicht, wie ich den str Wert aus dem main Verfahren zum BoldWrapper und ItalicWrapper passieren kann, so kann es verketten und wie sie zurückkehren, so dass die main Methode kann das Ergebnis anzeigen, das verkettet wurde.

Bitte geben Sie an, wenn etwas mit meinem Verständnis von Annotation nicht stimmt.

+2

Nö, du wirst in der Lage sein, dies zu tun nicht mit Anmerkungen. –

+0

Gibt es eine andere Möglichkeit, es mit Java zu machen, ohne das Decorator Design Pattern zu verwenden? – Crazenezz

+0

Sie können Objektdekoration in Java gut tun, aber nicht mit Anmerkungen. –

Antwort

1

1) Der von Ihnen zitierte Link ist ein guter - er entspricht dem "Decorator Pattern" in Bezug auf Java. "Design Patterns" selbst, ist natürlich unabhängig von einer bestimmten OO Sprache:

2) Hier ist ein weiterer guter Link:

In Java ist ein klassisches Beispiel für das Decorator-Muster die Implementierung von Java I/O Streams.

FileReader  frdr = new FileReader(filename); 
LineNumberReader lrdr = new LineNumberReader(frdr); 

4) Also ja, das "Decorator-Muster" ist ein guter Kandidat für dieses Problem.

Persönlich würde ich diese Art von Lösung bevorzugen:

String myHtml = 
    new BoldText (
     new ItalicText (
     new HtmlText ("See spot run"))); 

5) jedoch Anmerkungen sind auch eine Option. Zum Beispiel:

1

Wenn Sie mit Anmerkungen dabei diese Art von Sachen besonders interessiert sind (Sie müssen nicht wirklich):

Dieses Beispiel sollten Sie begonnen:

0

Obwohl dies löst nicht wie Sie Annotationen verwenden, wie Sie wollten, anstatt das "Dekorator Design" zu verwenden, könnte ich vorschlagen Sie verwenden das "Builder Design", wenn es besser zu Ihren Bedürfnissen passt (so scheint es).

Schnellverwendungsbeispiel:

public class BuilderPatternExample { 

    public static void main(String args[]) { 

     //Creating object using Builder pattern in java 
     Cake whiteCake = new Cake.Builder() 
           .sugar(1) 
           .butter(0.5) 
           .eggs(2) 
           .vanilla(2) 
           .flour(1.5) 
           .bakingPowder(0.75) 
           .milk(0.5) 
           .build(); 

     //Cake is ready to eat :) 
     System.out.println(whiteCake); 
    } 
} 

Ausgang: Kuchen {Zucker = 0,75, Butter = 0,5, Eier = 2, vanila = 2, Mehl = 1,5, Backpulver = 0,0, Milch = 0,5, Kirsche = 0}

Für die vollständige Umsetzung und eine sehr gute Erklärung, überprüfen Sie bitte http://javarevisited.blogspot.mx/2012/06/builder-design-pattern-in-java-example.html

+0

Vielen Dank für die Informationen, das Builder-Muster ist der Schlüssel, um das Problem zu lösen. Aber ich möchte immer noch mehr nach Annotation suchen, um das Problem zu lösen. Und mir ist auch bewusst, dass die Verwendung von Annotationen einen Nebeneffekt für den Speicher hat. – Crazenezz