【问题标题】:Is this idiomatic Java?这是惯用的Java吗?
【发布时间】:2010-09-30 16:08:42
【问题描述】:

请耐心等待...我认为这不是太主观,但也许我错了。

最近我想排除一些重复代码,这些代码在我们的 BlackBerry 应用程序上绘制了自定义位图背景。

(不过,这个问题与 BlackBerry 无关,因此我将在此处提供一些有关 BB GUI 的详细信息,以便非 BB Java 人员可以权衡......)

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

我想拥有一堆背景相同的屏幕,每个屏幕都进行某种自定义绘画......这就是我想出的:

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() 方法时,每个屏幕都可以在绘制背景之后(因此任何绘制都发生在背景之上)但在绘制屏幕组件之前(全屏时)发生自定义绘画内容。调用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专家,我该怎么做呢?)

编辑添加:这确实按描述工作 - 绘图按我想要的顺序发生。

【问题讨论】:

  • 可能(对BB api一无所知),你可以打电话给super.paint,之前,内部油漆
  • 如果我将抽象类更改为在 innerPaint 之前调用 super.paint 则 innerPaint 中的内容将绘制在按钮之上,等等
  • 只是对正确说这很好并且称为模板方法的答案的一个小补充:您可能希望使 paint() 最终,因此客户(具体子类)不会无意中弄乱它并破坏渲染。

标签: java oop blackberry


【解决方案1】:

是的,一般来说不仅是惯用的 Java,还有 OO。它被称为template method

【讨论】:

  • 谢谢!也许这是一个愚蠢的问题......我绝对只是一个初学者。
  • nahhh,有时我们倾向于发明已经发明的模式。很好问,然后发现它已经存在。从现在开始,您可以说嘿,我们不只是为此使用模板方法模式等。;)
  • 好吧,尽管 GoF 书在我的阅读清单上,但我实际上并没有阅读太多关于模式的内容。
【解决方案2】:

这几乎就是 Swing 的工作原理——参见JComponent.paintComponent 方法。 paint 方法调用paintBorder、paintComponent 和paintChildren,您可以重写paintComponent 来实现自己的绘图,而不会干扰标准的Swing 组件。

【讨论】:

  • 有趣 - 我已经很久没有使用 Swing 了,即便如此,它也只是本科生的一小节课。谢谢!
【解决方案3】:

欢迎来到设计模式:你发现的就是Template Method

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 2016-06-27
    • 2018-11-03
    • 1970-01-01
    • 2014-07-21
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多