【问题标题】:Design pattern to plot different methods of a single object绘制单个对象的不同方法的设计模式
【发布时间】:2014-05-28 19:22:56
【问题描述】:

我试图弄清楚如何将设计模式应用于现有对象以绘制对象的不同方法。

我知道如何在 Java 中“绘图”。我已经定义了我的对象。我不想做的是:

myObject.plotMethodA(xMin, xMax)
myObject.plotMethodB(xMin, xMax)

我希望有办法:

plotMethod(myObject.MethodA, xMin, xMax)
plotMethod(myObject.MethodB, xMin, xMax)

这种心态看起来就像传递一个指向函数的指针。在 Java 中有很多人反对这样做。必须有一种更优雅的方式来处理这个问题,但我不太明白如何将它映射到现有的设计模式。答案是:

plotMethod(myObject, "Method A", xMin, xMax)

这就像向绘图对象发出“命令”并将对象交给他们。然后我的绘图对象与定义的接口一起使用,该接口与代表 myObject 实例的类一起操作。它必须花一点时间找出字符串“command”,否则可以选择适当的方法来绘制。

有没有更好的方法?谢谢!

【问题讨论】:

  • 我不知道“情节”是什么意思。你应该解释一下这是什么意思。
  • 使用术语情节作为文字或抽象。我的意思是 myObject 有一系列方法。这些方法是简单的功能:例如我的对象.MethodA(x) = x^2; myObject.MethodB(x) = x + 2。我希望在屏幕上绘制它。因此,我试图了解一种设计模式和 Java 实现,这将使我能够绘制 myObject 拥有的多种方法之一。

标签: java plot


【解决方案1】:

如果您使用的是 Java 8,您可以通过传入方法引用来做到这一点。你可以在这里找到它们的工作原理:http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

在概念上,你最终会做类似这样的事情:

plotMethod(myObject.MethodA, xMin, xMax)
plotMethod(myObject.MethodB, xMin, xMax)

但它看起来像这样,语法上:

plotMethod(myObject::MethodA, xMin, xMax)
plotMethod(myObject::MethodB, xMin, xMax)

这比

plotMethod(myObject, "Method A", xMin, xMax)

因为它会有一些类型安全性。例如,您将只能传入一个接受并返回正确参数的方法/函数。


以下是一些工作代码作为示例:

package com.sandbox;

import java.util.function.BiConsumer;

public class Sandbox {
    public static void main(String[] args) {
        ClassWithSimilarMethods obj = new ClassWithSimilarMethods();
        callMethod(obj::methodA, 1, 2);
        callMethod(obj::methodB, 1, 2);
    }

    private static void callMethod(BiConsumer<Integer, Integer> methodA, int x, int y) {
        methodA.accept(x, y);
    }


    public static class ClassWithSimilarMethods {

        public void methodA(int x, int y) {
            System.out.println("methodA");
        }

        public void methodB(int x, int y) {
            System.out.println("methodB");
        }

    }

}

打印出来

methodA
methodB

【讨论】:

    【解决方案2】:

    您所描述的似乎是一种功能更强大的编程方法,它在 Java 中还没有“漂亮”地实现......直到现在。我讨厌简单地链接源代码,但这是对您正在尝试做的事情以及 Java 所处位置的一个很好的概述。如果您在这个项目中使用了 Java 8,那么您很幸运,因为它确实包含 Lambda 表达式(它刚刚在今年 3 月发布)。这是链接:

    http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

    您基本上想定义功能并将其传递给方法。在没有看到源代码或项目目标的情况下,我不确定我是否可以进一步评论。

    【讨论】:

    • 我认为你是对的......所以我试图将我的大脑从函数式编程重构为面向对象的编程。我拥有的对象包括多种方法。这些方法在某种意义上是属性。例如:类植物可能有一个生长速率和一个开花速率。可能存在具有不同生长和开花率的植物亚类。但是,我希望植物能够以图形方式向我展示其随时间的生长速度。图形方法是通用的,但速率是唯一的。因此,图形的输入是一个“函数”,但绘制图形的方法是通用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多