2010-09-30 43 views
5

Chịu với tôi ... Tôi không nghĩ rằng điều này quá chủ quan nhưng có thể tôi đã sai.Đây có phải là Java không chính thức không?

Gần đây tôi muốn đưa ra một số mã lặp đi lặp lại đã vẽ nền Bitmap tùy chỉnh trên ứng dụng BlackBerry của chúng tôi.

(Câu hỏi này là không thực sự về BlackBerry mặc dù, vì vậy tôi sẽ cung cấp một số chi tiết ở đây về BB GUI để mọi người phi BB Java có thể cân nhắc trong ...)

Các FullScreen lớp là từ BB API - nó có một phương thức vẽ (Graphics) mà khung gọi để vẽ màn hình và bất kỳ thành phần nào được thêm vào nó. Có thể ghi đè lên để làm bức tranh tùy chỉnh - như vẽ nền Bitmap trước khi bất kỳ bức tranh nào khác xảy ra (BB API mới hơn cung cấp lớp nền nhưng ứng dụng của chúng tôi phải hoạt động trên điện thoại cũ).

Tôi muốn có một loạt các màn hình tất cả cùng một nền, mỗi đã làm một số loại sơn tùy chỉnh ... đây là những gì tôi đã đưa ra:

abstract public class BGFullScreen extends FullScreen { 
    Bitmap bg; 

    public BGFullScreen(Manager mgr, long style) { 
     super(mgr, style); 
     bg = Bitmap.getBitmapResource("bg.jpg"); 
    } 

    abstract protected void innerPaint(Graphics g); 

    protected void paint(Graphics g) { 
     g.drawBitmap(new XYRect(0, 0, bg.getWidth(), bg.getHeight()), bg, 0, 0); 

     innerPaint(g); 

     super.paint(g); 
    } 
} 

Mỗi màn hình sau đó sẽ phân lớp trừu tượng này lớp và thực hiện innerPaint(). Bằng cách này khi khung công tác BB gọi phương thức paint(), mỗi màn hình có thể có các công cụ vẽ tùy chỉnh xảy ra SAU nền được vẽ (vì vậy bất kỳ bức tranh nào xảy ra trên nền) nhưng TRƯỚC các thành phần của màn hình được vẽ, khi FullScreen. paint() được gọi.

(Tôi đã đưa ra với điều này bởi vì tôi đã nghiên cứu Common Lisp ở nhà, và nó xảy ra với tôi rằng những gì tôi muốn làm là một cái gì đó giống như sự kết hợp giữa phương pháp xen kẽ trong Clos)

Dưới đây là một việc thực hiện mẫu của lớp trừu tượng trên:

public class MainAppScreen extends BGFullScreen { 

    public MainAppScreen() { 
     super(new VerticalFieldManager(), 0); 
     // add some components to the screen: 
     add(new ButtonField(...)); 
     add(...) 
    } 

    protected void innerPaint(Graphics g) { 
     // stuff drawn will be on top of background and under buttons 
     g.draw(...) 
    } 
} 

về cơ bản tôi muốn có một lớp trẻ để thực hiện một phương pháp được gọi ở giữa thực hiện mẹ của nó và thực hiện nó ông bà của cùng một phương pháp. Tôi không thể tìm ra cách nào khác để làm điều này trong Java ...

Đây có phải là Java không chính thức không? Điều này thực sự thực sự phổ biến và đó là một câu hỏi ngớ ngẩn? Đây thực sự là thiết kế khủng khiếp? (Các chuyên gia BB, làm thế nào tôi có thể làm điều này theo bất kỳ cách nào khác?)

Đã chỉnh sửa để thêm: Thao tác này được mô tả - bản vẽ sẽ diễn ra theo thứ tự tôi muốn.

+0

có thể (không biết gì về BB api), bạn có thể gọi 'super.paint', trước đó, sơn bên trong – OscarRyz

+0

Nếu tôi thay đổi lớp trừu tượng để gọi super.paint trước innerPaint thì những thứ trong innerPaint được vẽ trên đầu Các nút bấm, vv – spacemanaki

+3

Chỉ cần thêm một phần nhỏ vào câu trả lời chính xác rằng điều này là tốt và được gọi là Phương thức mẫu: bạn có thể muốn vẽ() cuối cùng, vì vậy các máy khách (các lớp con cụ thể) không thể vô tình gây rối và phá vỡ nó dựng hình. –

Trả lời

5

Có, và không chỉ là thành ngữ Java, mà là OO nói chung. Nó được gọi là template method

+0

Cảm ơn! Có lẽ đó là một câu hỏi ngớ ngẩn ...Tôi chắc chắn chỉ là người mới bắt đầu. – spacemanaki

+0

nahhh, theo thời gian, chúng tôi có xu hướng phát minh ra các mẫu đã được phát minh. Nó là tốt để hỏi, và sau đó tìm ra nó đã tồn tại. Từ bây giờ, bạn có thể nói * này, chúng tôi không chỉ sử dụng mẫu phương thức mẫu cho * vv;) – OscarRyz

+0

Tôi chưa thực sự đọc nhiều về các mẫu trong cuốn sách GoF có trong danh sách cần đọc của tôi . – spacemanaki

2

Đây gần như chính xác cách thức hoạt động của Swing - xem phương thức JComponent.paintComponent. Phương thức vẽ gọi paintBorder, paintComponent và paintChildren và bạn có thể ghi đè lên paintComponent để triển khai bản vẽ của riêng bạn mà không can thiệp vào các thành phần Swing tiêu chuẩn.

+0

Thú vị - Tôi đã không sử dụng Swing trong một thời gian dài và thậm chí sau đó nó chỉ là một lớp ngắn trong undergrad. Cảm ơn! – spacemanaki

0

Chào mừng bạn đến với mẫu thiết kế: Những gì bạn khám phá được gọi là Template Method.

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