2014-04-14 51 views
0

我想弄清楚如何將設計模式應用於現有對象來繪製對象的不同方法。設計模式繪製單個對象的不同方法

我知道如何在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實例的類進行操作。它必須花費一點時間來計算字符串「命令」,但除此之外可以選擇合適的繪圖方法。

有沒有更好的方法?謝謝!

+0

我不知道這是什麼意思「陰謀」的東西。你應該解釋一下這意味着什麼。 –

+0

使用術語圖作爲文字或抽象。我的意思是myObject有一系列的方法。這些方法是簡單的功能:例如myObject.MethodA(x)= x^2; myObject.MethodB(x)= x + 2.我希望在屏幕上繪製它。所以,我想了解一個設計模式和Java實現,這將使我能夠繪製myObject所具有的多個方法之一。 – user3533030

回答

0

如果您使用的是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 
0

什麼你所描述的似乎是一個功能更強大的編程方法而沒有實行「美麗「在Java中......直到現在。我不喜歡簡單地鏈接源代碼,但是這很好地概述了你想要做什麼以及Java在哪裏。如果你在這個項目上有Java 8,那麼你很幸運,因爲它包含了Lambda表達式(它剛剛在今年3月發佈)。這裏的鏈接:

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

你基本上要定義的功能,並將其傳遞給方法。沒有看到源代碼或項目目標,我不確定我可以進一步評論。

+0

我認爲你是對的......所以我試圖將我的大腦從函數式編程重構成面向對象的編程。我擁有的對象包括多種方法。這些方法在某種意義上屬於屬性。例如:班級植物可能有增長率和開花率。可能存在具有不同生長和開花率的植物亞類。但是,我想要一個工廠以圖形方式向我展示其增長率。圖形方法是通用的,但速率是唯一的。所以,圖的輸入是一個「函數」,但是圖的方法是通用的。 – user3533030