2012-08-22 11 views
12

widzę o dekoratora example w Pythonie:Dekorator w Javie

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> 

I dostał jakiś ciekawy sposób można zaimplementować w Javie, więc szukać i dostał jakiś przykład używając Decorator Design Pattern.

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

} 

Jak mogę zrobić to jak na przykład Python powyżej używając Java adnotacji jak ten:

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

dostałem jakiś problem, gdy próbowałem zrobić próbkę, problemem jest to, że nie wiem jak mogę przekazać wartość str z metody do BoldWrapper i ItalicWrappermain więc może złączyć i jak go zwrócić, więc main metoda może wyświetlić wynik, który został połączony.

Należy poinformować, jeśli coś jest nie tak z moją adnotacją.

+2

nie, nie będziemy w stanie to zrobić z adnotacji. –

+0

Czy jest inny sposób, aby zrobić to z java bez używania wzorca projektu Decorator? – Crazenezz

+0

Dekoracje obiektów można wykonywać w Javie, ale bez adnotacji. –

Odpowiedz

1

1) Podany link jest dobry - jest zgodny z "Wzorcem dekoratora" w odniesieniu do środowiska Java. "Wzorce projektowe" sami, oczywiście, są niezależne od konkretnego języka OO

2) Oto kolejny dobry Link:

W języku Java klasycznym przykładem wzoru dekoratora jest implementacja strumieni we/wy Java.

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

4) Tak, "wzór dekoratora" jest dobrym kandydatem do tego problemu.

Osobiście wolałbym tego rodzaju rozwiązanie:

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

5) Jednakże są również adnotacje opcja. Na przykład:

1

Jeśli jesteś szczególnie zainteresowany robieniem tego typu rzeczy z adnotacji (nie trzeba się naprawdę):

Ten przykład powinien zacząć grę:

0

Mimo że nie rozwiązuje to problemu z używaniem adnotacji, zamiast używać "projektu dekoratora", mógłbym zaproponować używasz "projektu konstruktora", jeśli lepiej pasuje on do twoich potrzeb (wygląda na to).

prosty przykład użycie:

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

wyjściowa: ciasto {cukier = 0,75, masło = 0,5, jaja = 2, wanilii = 2, mąka = 1,5, proszek do pieczenia = 0,0, mleko = 0,5; cherry = 0}

dla pełnego wykonania oraz bardzo dobre wyjaśnienie, proszę sprawdzić http://javarevisited.blogspot.mx/2012/06/builder-design-pattern-in-java-example.html

+0

Bardzo dziękuję za informacje, użycie Wzorca Konstruktora jest kluczem do rozwiązania problemu. Ale nadal chcę dowiedzieć się więcej, jeśli to możliwe, aby skorzystać z Adnotacji, aby rozwiązać problem. I wiem również, że użycie adnotacji ma efekt uboczny dla pamięci. – Crazenezz