重用函数时使用的模式

时间:2017-02-16 03:36:40

标签: java oop design-patterns callback

所以我想重用一些功能,比如try catch和我的应用程序使用的一些其他常用功能。我想知道这种方法是否合适。或者,如果有任何其他方法会很棒。我想了解如何实现这一点的不同方法。

这是服务将使用的回调函数。

 public interface ClientOperation <T>{
      T doAction(SomeObject someObject);
    }

这是将执行ClientOperation

的回调函数的接口
 public interface Executor {

    <T> T doTask(ClientOperation<T> operation);
    }

Executor

的实施类
    public class ExecutorImpl implements Executor {



    public <T> T doTask(ClientOperation<T> operation) {
        T response = null;
        /*
            DO SOMETHING FIRST - USED BY ALL CLASSES
        */

        try {
            response = operation.doAction(someObject);
        } catch (SomeException e) {
            /*
                DO SOME SERIOUS STUFF
            */

        } catch (Exception e) {
            LOGGER.error(e.getMessage());
            throw new SystemException(e.getMessage(), e);
        }

        return response;
    }
}

执行某项操作并实现回调函数的服务

public void addSomething(final Secret secret)
            throws UnauthorizedActionException, InvalidSecretKeyException {

            executorService.doTask(new ClientOperation<Response>() {
                public Response doAction(SomeObject someObject) {

                //DO STUFF ON THIS
                    return template.write(secret.getPath(),
                            secret.getSecretValue());

                }
            });


}

1 个答案:

答案 0 :(得分:1)

  

我想了解如何实现这一点的不同方法。

你的方法似乎很好。我会更进一步,并使输入(即SomeObject)通用,以便ClientOperation可以使用不同的输入类型。

public interface ClientOperation <T,S>{
      T doAction(S someObject);
}

另一种方法是使用Template Method模式,其中ClientOperation转换为abstract类,并使用abstract doAction方法和具体{在final块中调用doTask的{​​1}} doAction方法。子类提供try-catch方法的实现。这种方法的一个缺点是你不能从任何其他类扩展。