2012-04-13 9 views
9

Tôi mới sử dụng các mẫu thiết kế và tôi được yêu cầu số in từ 1 đến 10 sử dụng kiểu trang trí. Tôi xin lỗi nếu điều này là tầm thường nhưng tôi cần phải học. Đây là những gì tôi có cho đến nay:Rất đơn giản Sử dụng mẫu trang trí để tạo số

Interface

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

Tóm tắt Lớp

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

Không chắc chắn làm thế nào để tiến hành hoặc thậm chí nếu tôi đang đi đúng cách. Ai đó có thể làm sáng tỏ không?

+1

có thể xem tại đây http://en.wikipedia.org/wiki/Decorator_pattern? có một mẫu mã khá tốt. – dhblah

+1

Bạn muốn trang trí lớp 'PrintNumbers' như thế nào? – dash1e

+0

@gasan: Có, tôi đã xem ví dụ về cà phê đó và đã đưa ra phiên bản mã của tôi. Vấn đề là, tôi không chắc chắn về cách thức hoạt động của nó. Tôi biết nó được sử dụng để cập nhật các đối tượng động nhưng cần một bức tranh rõ ràng hơn. – noMAD

Trả lời

6

Đầu tiên lớp trang trí không phải mở rộng lớp trang trí nhưng thực hiện cùng một giao diện.

Nhìn vào Wikipedia page này.

Vì vậy, bạn có thể sửa trang trí của bạn như thế này:

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

Sau đó, ví dụ bạn có thể nhân số bằng 2.

public class DoubleDecoratorCount extends DecoratorCount { 

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

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

Và bạn có thể kiểm tra trang trí theo cách này

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

Tại thời điểm này, bạn có thể viết tất cả các trang trí bạn cần:

  • Nhân với 3;
  • Để viết kết quả bằng chữ cái;
  • Để ghi kết quả bằng hex;
  • Vv ...
+0

Cảm ơn vì điều này.Tôi thấy bạn có trang trí trừu tượng và lớp để trang trí riêng biệt. Bây giờ trong 'DoubleDecorateeCount' tôi có gọi là' main() 'không? – noMAD

+0

Tốt hơn bạn nên đặt 'main()' trong một lớp riêng biệt. Tôi vừa cập nhật câu trả lời với một mẫu. – dash1e

3

Trước tiên, bạn cần thứ gì đó có thể cần trang trí, sau đó bạn cần trang trí cho rằng điều gì đó. Cả hai lớp, lớp cơ sở và trình trang trí là các lớp cụ thể và có thể được sử dụng trực tiếp.

Trang trí bộ đếm từ 1 đến 10 không có ý nghĩa nhiều (số luôn đẹp;)). Nhưng bạn có thể thực hiện một lớp cơ bản để in các số không định dạng và sau đó thực hiện một trình trang trí, có thêm một số vẻ đẹp cho kết quả in.

+0

Điều này đã cho tôi hiểu rõ hơn về lý do tại sao chúng tôi sử dụng mẫu này. Cảm ơn một tấn :) – noMAD

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