2017-06-21 80 views
0

好吧我正在開發這個庫,我需要用戶能夠實現他自己的渲染方法的實現,如果「默認」不滿意,我該怎麼做?發送一個方法實現參數

我知道這是可能在JavaScript中發送的功能,我想我需要在Java類似的結構..

我一直在考慮lambda表達式,也是方法的Java類的..

你會大家說是我最好的選擇?

+2

要按照關於Lambda的指南,他們正是你想要的。舊的方式將是一個[Command Pattern](https://en.wikipedia.org/wiki/Command_pattern)來傳遞實例來執行它(這基本上是lambda會做的) – AxelH

回答

1

如果我正確理解你的問題,你會想要一個系統,其中一個使用你的庫的人可以通過某種方式用他們自己的實現覆蓋默認算法。這可能是這個樣子:

public class Renderer{ 
    // Declare an interface which specifies a single method that handles rendering 
    public interface RenderHandler{ void render(float f, float f1); } 

    // Declare a default implementation that is created with each instance of the Renderer 
    protected RenderHandler handler = (f, f1) -> { System.out.println("Replace me!"); }; 

    // Define a system of replacement for the rendering routine 
    public void replaceHandler(RenderHandler replacement){ 
     if(replacement!=null) handler = replacement; // Determine a viable replacement 
    } 

    // This shows that the same method can be called but yield different results 
    // based on how the RenderHandler object in the "handler" field is implemented 
    public void handleRender(float f, float f1){ handler.render(f, f1); } 
} 

現在,這個例子可以讓你的庫的用戶呼叫replaceHandler()用定製實現替換自帶的渲染對象的默認之一。例如:

public static void main(String[] args){ 
    Renderer r = new Renderer();        // Create Renderer object 
    r.handleRender(1f, 2f);         // Prints "Replace me!" 
    r.replaceHandler((f, f1)->{ System.out.println(f*f1); }); // Lambda implementation 
    r.handleRender(1f, 2f);         // Prints "2" 
} 

正如您所看到的,替換的實際實現由使用您的庫的人員處理(默認實現除外)。因此,您不必擔心如何實施,只有這樣,如果請求替換,那麼它實際上會使用。這意味着如果您想支持自定義渲染例程的選項,您可以通過使用適當的方法定義一個接口來執行此操作,並簡單地實現默認方法並允許使用方法進行替換(如第一個代碼示例所示) 。