任务授权

时间:2017-08-10 23:22:42

标签: java oop design-patterns object-oriented-analysis

我有一个接口,让我们说2个方法,并有3个不同的实现。

public interface IFace {
    public void method1(Param param1);
    public void method2(Param param2);
}

public class A implements IFace {
    public void method1(Param param1){}
    public void method2(Param param2){}
}

public class B implements IFace {
    public void method1(Param param1){}
    public void method2(Param param2){}
}

public class C implements IFace {
    public void method1(Param param1){}
    public void method2(Param param2){}
}

现在我有一个要求,根据这个要求,这两种方法中只有一种需要修改,并且有一些前提条件,我决定调用特定的实现,模式是我可能必须经历的那些逐个实现。这看起来非常适合责任链,我创造了这样的:

public interface IChain {
    public void method1(Param param1);
    public void setNextChain(IChain iChain);
} 

public class AA implements IChain {
    private IChain chain;

    private IFace a;

    public void method1(Param param1){
        if (thisConditionIsSatisfied(param1)) {
            a.method1(param1);
        } else {
            chain.method1();
        }
    }

    public void setNextChain(IChain chain){
        this.chain = chain
    }

    public void setA(IFace a) {
        this.a = a;
    }
}

public class BB implements IChain {
    private IChain chain;

    private IFace b;

    public void method1(Param param1){
        if (thisConditionIsSatisfied(param1)) {
            b.method1(param1);
        } else {
            chain.method1();
        }
    }

    public void setNextChain(IChain chain){
        this.chain = chain
    }

    public void setA(IFace b) {
        this.b = b;
    }
}

public class CC implements IChain {
    private IChain chain;

    public void method1(Param param1){
        if (thisConditionIsSatisfied(param1)) {
            //process it here
        } else {
            throw new RuntimeException("Couldn't process request.")
        }
    }

    public void setNextChain(IChain chain){
        this.chain = chain
    }

}

正如您所看到的,CC不会委托给正在实施IFace的C类,而且是一个全新的实现。

这是我正在展示的一小部分,但问题实际上是相同的,我在条件评估,异常处理,调用接口的正确实现等方面看到了很多重复。

虽然这比尝试扩展现有界面要好得多,但我想知道是否有任何建议可以在未来的可扩展性或OOPS模式跟随方面做得更好。

1 个答案:

答案 0 :(得分:0)

我不这么认为。虽然看起来它可以制作成更好的设计而且重复性更低,但它似乎并不存在。你的解决方案非常好,但在我看来,这可能是最好的方法。