装饰图案与多个泛型

时间:2016-06-14 06:11:49

标签: java generics decorator

我目前正在进行一些代码重构。所以我想用inheritance设计替换现有的decorator设计。但是我正在努力研究多种泛型(可能根本不可能)。

Decorator implementation

我现在有上述设计。 IConstraint check是一个针对已实现约束的类。这些约束的具体实现是SimpleConstraintASimpleConstraintB它们都在检查来自ClassA的一些值。 Decorator增强了约束,例如当指定值不在范围内时,有一些约束不应该被检查。 ClassA实现接口IAIB,以便DecoratorADecoratorB可以使用它。

设计的用法如下:

Test classToCheck = new Test("test");
IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint()));
boolean value = constraint.check(classToCheck);

所以我想要的是使用具有不同数量的输入参数和不同类型的代码。喜欢:

Test classToCheckA = new Test("testA");
Test classToCheckB = new Test("testB");

IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint()));
boolean value = constraint.check(classToCheckA, classToCheckB);

或者:

Test classToCheckA = new Test("testA");
// TestB does implement the same interfaces as Test
TestB classToCheckB = new TestB("testB");

IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint()));
boolean value = constraint.check(classToCheckA, classToCheckB);

或者:

Test classToCheckA = new Test("testA");
// TestB does implement the same interfaces as Test
TestB classToCheckB = new TestB("testB");
// TestC does implement the same interfaces as Test
TestC classToCheckC = new TestC("testC");

IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint()));
boolean value = constraint.check(classToCheckA, classToCheckB, classToCheckC);

我尝试使用varargsListsObject[]代替T中的check(obj:T)但我总是需要强制转换和大量异常处理(例如输入参数的数量需要正确),所以我不满意。

以下代码是我尝试过的一个例子。就像您在SimpleConstraint check方法中看到的那样,只允许使用类型(Test)。

public interface IConstraint<T extends ICheckable> {
    public boolean check(T[] checkable);
}

public class SimpleConstraint implements IConstraint<Test> {
    @Override
    public boolean check(Test[] checkable) {
        return true;
    }
}

使用上面的代码无法做到这一点:

Test classToCheckA = new Test("testA");
// TestB does implement the same interfaces as Test
TestB classToCheckB = new TestB("testB");
IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint()));
boolean value = constraint.check(classToCheckA, classToCheckB);

设计是否有一些改进,以便可以支持不同数量的输入参数和不同类型?

1 个答案:

答案 0 :(得分:2)

在上面的代码中,问题是,Test和TestB没有共同的祖先......

IConstraint<Test> constraint = ...
boolean value = constraint.check(classToCheckA, classToCheckB);

如果TestB extends Test或其他方式,您可以使其有效。

更好的方法是

IConstraint<ICheckable> constraint =