这是惯用的Java吗?

时间:2010-09-30 16:08:43

标签: java oop blackberry

忍受我......我不认为这太主观但也许我错了。

最近,我想在我们的BlackBerry应用程序中分解一些重复的代码,这些代码在我们的BlackBerry应用程序中绘制了自定义的Bitmap背景。

(这个问题并不是关于黑莓的,所以我会在这里提供一些关于BB GUI的细节,以便非BB的Java人可以权衡......)

类FullScreen来自BB API - 它有一个方法paint(Graphics),框架调用它来绘制屏幕和添加到它的任何组件。可以覆盖它来进行自定义绘制 - 比如在任何其他绘制发生之前绘制Bitmap背景(较新的BB API提供Background类但我们的应用程序必须在旧手机上工作)。

我想拥有一堆具有相同背景的屏幕,每个屏幕都做了一些自定义绘画...这就是我想出的:

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

然后,每个屏幕将继承此抽象类并实现innerPaint()。这样,当BB框架调用paint()方法时,每个屏幕都可以在绘制背景后进行自定义绘制(因此任何绘制都发生在背景之上)但是在绘制屏幕的组件之前,当使用FullScreen时。 paint()被调用。

(我提出这个是因为我在家里一直在研究Common Lisp,我想到我想做的事情就像CLOS中的交错方法组合一样)

以上是上面抽象类的示例实现:

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

基本上我想要一个子类实现一个方法,在它的父实现和祖父母的同一方法的实现之间调用。我无法想出用Java做任何其他方法......

这是这个自私的Java吗?这实际上是非常普遍的,这是一个愚蠢的问题吗?这实际上是可怕的设计吗? (BB专家,我怎么能这样做呢?)

编辑添加:这确实如上所述 - 绘图按我想要的顺序发生。

3 个答案:

答案 0 :(得分:5)

是的,不仅是惯用的Java,而且是OO。它被称为template method

答案 1 :(得分:2)

这几乎就是Swing的工作方式 - 请参阅JComponent.paintComponent方法。 paint方法调用paintBorder,paintComponent和paintChildren,您可以覆盖paintComponent来实现自己的绘图,而不会干扰标准的Swing组件。

答案 2 :(得分:0)

欢迎使用设计模式:您发现的内容称为Template Method