2012-08-22 26 views
12

tôi thấy về trang trí example bằng Python:Decorator trong 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> 

Và có một số tò mò như thế nào nó có thể được thực hiện trong Java, vì vậy tôi tìm kiếm và nhận được một số ví dụ sử dụng 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>"; 
    } 

} 

Làm thế nào để làm cho điều này giống như ví dụ Python trên sử dụng một chú giải Java như thế này một:

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

tôi có một số vấn đề khi tôi đã cố gắng để làm mẫu, vấn đề là tôi không biết cách tôi có thể chuyển giá trị str từ phương thức main đến BoldWrapperItalicWrapper để nó có thể ghép nốicách trả lại giá trị đó, vì vậyPhương phápcó thể hiển thị kết quả đã được ghép nối.

Vui lòng thông báo nếu có sự cố với hiểu biết của tôi về chú thích.

+2

Nope, bạn sẽ không để có thể làm điều này với chú thích. –

+0

Có cách nào khác để làm cho nó bằng java mà không cần sử dụng Mẫu thiết kế trang trí? – Crazenezz

+0

Bạn có thể làm trang trí đối tượng trong Java tốt, nhưng không phải với chú thích. –

Trả lời

1

1) Liên kết bạn trích dẫn là một liên kết tốt - nó thực hiện công bằng cho "Mẫu trang trí" liên quan đến Java. "Design Patterns" bản thân, tất nhiên, không phụ thuộc bất kỳ ngôn ngữ OO cụ thể:

2) Dưới đây là một liên kết tốt:

Trong Java, một ví dụ cổ điển của mẫu trang trí là việc triển khai luồng I/O Java.

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

4) Vì vậy, có "mẫu trang trí" là một ứng cử viên tốt cho vấn đề này.

Cá nhân, tôi sẽ thích loại hình giải pháp:

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

5) Tuy nhiên chú thích cũng là một lựa chọn. Ví dụ:

1

Nếu bạn đặc biệt quan tâm đến việc làm loại công cụ này với chú thích (bạn không cần phải thực sự):

Ví dụ này sẽ giúp bạn bắt đầu:

public class AnnotationTest 
{ 
    @Target(ElementType.METHOD) 
    @Retention(RetentionPolicy.RUNTIME) 
    public static @interface TagWrapper 
    { 
     public String[] value() default {}; 
    } 

    public static interface TextFragment 
    { 
     public String getText(); 
    } 

    public static class TagWrapperProcessor 
    { 
     public static String getWrapperTextFragment(TextFragment fragment) 
     { 
      try 
      { 
       Method getText = fragment.getClass().getMethod("getText"); 
       TagWrapper tagWrapper = getText.getAnnotation(TagWrapper.class); 
       String formatString = "<%s>%s</%s>"; 
       String result = (String) getText.invoke(fragment); 
       for (String tag : tagWrapper.value()) 
       { 
        result = String.format(formatString, tag, result, tag); 
       } 
       return result; 
      } 
      catch (Exception e) 
      { 
       throw new RuntimeException(e); 
      } 
     } 
    } 

    public static class BoldItalicFragment implements TextFragment 
    { 

     private String _text; 

     public BoldItalicFragment(String text) 
     { 
      _text = text; 
     } 

     @Override 
     @TagWrapper(
     { 
      "b", "i" 
     }) 
     public String getText() 
     { 
      return _text; 
     } 

    } 

    @Test 
    public void testStuff() 
    { 
     System.out.println(TagWrapperProcessor.getWrapperTextFragment(new BoldItalicFragment("Hello, World!"))); // prints: <i><b>Hello, World!</b></i> 
    } 
} 
0

Mặc dù điều này không giải quyết cách sử dụng chú thích như bạn muốn, thay vì sử dụng "thiết kế trang trí", tôi có thể đề xuất bạn sử dụng "thiết kế xây dựng" nếu nó phù hợp hơn với nhu cầu của bạn (có vẻ như vậy).

sử dụng nhanh Ví dụ:

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

Output: Bánh {đường = 0,75, bơ = 0,5, trứng = 2, Vanila = 2, bột = 1,5, bột nở = 0,0, sữa = 0,5, cherry = 0}

Đối với thực hiện đầy đủ và một lời giải thích rất tốt, xin vui lòng kiểm tra http://javarevisited.blogspot.mx/2012/06/builder-design-pattern-in-java-example.html

+0

Cảm ơn bạn rất nhiều về thông tin, sử dụng Mẫu Builder là chìa khóa để giải quyết vấn đề. Nhưng tôi vẫn muốn nghiên cứu thêm nếu có thể sử dụng Chú thích để giải quyết vấn đề. Và tôi cũng biết rằng việc sử dụng chú thích có tác dụng phụ cho bộ nhớ. – Crazenezz

Các vấn đề liên quan