2017-06-21 82 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" 
} 

正如您所看到的,替换的实际实现由使用您的库的人员处理(默认实现除外)。因此,您不必担心如何实施,只有这样,如果请求替换,那么它实际上会使用。这意味着如果您想支持自定义渲染例程的选项,您可以通过使用适当的方法定义一个接口来执行此操作,并简单地实现默认方法并允许使用方法进行替换(如第一个代码示例所示) 。