OOP设计 - 需要准备每个方法调用并清理完毕

时间:2011-11-29 11:14:17

标签: java oop design-patterns

我的问题是创建一个允许安全地使用对象(设置容器或简单容器)的类。我有10个以上的方法,我必须重复相同的操作:保存容器的状态,更改状态,做一些工作,恢复状态,返回结果。例如:

public List<String> childKeys() {
    //saving state (repeated many time in other methods)
    final String clientGroup = clientSettings.group();
    //changing state  (repeated many time in other methods)
    clientSettings.endAllGroups();
    clientSettings.beginGroup(currentGroup);
    //doing job (exclusive for each method)
    final List<String> childKeys = clientSettings.childKeys();
    //restoring state  (repeated many time in other methods)
    clientSettings.endAllGroups();
    clientSettings.beginGroup(clientGroup);

    return childKeys;
}

我需要这样做以防止用户更改系统设置并希望避免多次编写相同的代码。
您是否看到任何重新设计代码的方法,以便可以自动准备和清理方法调用?

5 个答案:

答案 0 :(得分:2)

创建一个具有基本流的abstract类,并使用具体类必须实现的abstract方法。

答案 1 :(得分:2)

如果我理解你,你想确保在某组方法之前和/或之后调用某个代码?

您考虑过AOP了吗?这将是一个很好的方法,可以将相同的代码添加到一堆方法调用中,而不会在整个地方使用超类/额外调用来污染您的代码。

Spring-AOP是一个不错的实现,它使用了AspectJ。看看。

答案 2 :(得分:1)

有几个选项,一个是应用命令模式。如果不同的函数(方法)只在几行中有所不同,这可能没有意义,在这种情况下,AOP解决方案可能是更好的选择 - 如@Guillaume所述。

示例:

public abstract class Command<T> {

    public final T execute() {

        /* do common stuff... */
        clientSettings.endAllGroups();
        clientSettings.beginGroup(currentGroup);

        /* do the concrete stuff... */
        T t = this.performConcrete();

        /* do common stuff... */
        clientSettings.endAllGroups();
        clientSettings.beginGroup(clientGroup);

        return t;
    }

    protected abstract T performConcrete();
}

具体实施:

public class ChildKeysCommand<List<String>> extends Command {

    protected List<String> performConcrete() {
        return clientSettings.childKeys();
    }

}

来电者:

ChildKeysCommand c = new ChildKeysCommand();
List<String> keys = c.execute();

答案 3 :(得分:0)

也许你可以创建一个原子方法来生成两个方法(endAllGroups和beginGroup),一个名为changeState(Group group)的方法......在这种情况下,只要你愿意,方法就会被改变或修改...... / p>

答案 4 :(得分:0)

正如人们所说,使用AOP框架是明显的最佳选择。

如果由于某种原因无法使用,或者您希望通过对代码库的最小更改来实现,则可以通过使用java.lang.reflect.Proxy创建代理类来实现相同的功能。你只需要非常好地记录它......