在下文中,我提供了我的问题的抽象描述,因为如果我提供上下文和特定代码会更复杂。
我有一个班级Specification
。文件读取器从文件访问特定的嵌套规范,并相应地提供Specification
实例。该文件可能包含不完整的规范,即稍后将绑定某些值(例如,来自用户输入)。
class Specification{
Criteria spec1;
AnotherCriteria spec2;
...
}
现在考虑界面:
Interface Criteria {
criteriaMethod1();
criteriaMethod2();
}
考虑实施班:
class ConcreteCriteria1 implements Criteria{
someDataMember;
@Overrride
criteriaMethod1(){
// some implementation goes here
}
@Overrride
criteriaMethod2(){
// some implementation goes here
}
}
现在让我们考虑一个负责执行某些特定任务的类,具体取决于传递的Criteria
:
class WorkExcuter {
doSomeWork(Criteria criteria);
}
我有一个案例,例如,传递给criteria
的{{1}} 未知,处于等待状态以从用户那里获得一些输入。这种未知状态强制某些特定的附加属性,例如,它是字符的最大长度,标识符,等待时间等。为了对此进行建模,让我们考虑一下:
doSomeWork
问题:
我想要一种“智能”方式(例如某种设计模式)来制作两者,Interface ReuqiredInput {
reuqiredInputMethod1();
}
(在Specification
数据memebr中)和spec1
接受{当状态未知如上所述时,{1}}而不是标准。因此,他们应该接受这两种情况:doSomeWork
或ReuqiredInput
。
可能的解决方法:
除了Criteria
之外,还要RequiredInput
实施ConcreteCriteria1
;即,具有实现两个接口的单个具体类;但是,我将把我的具体课作为一个丑陋的 ReuqiredInput
在两个不同的元素集之间彼此无关,它必须有一个方法来确定哪个集合填充元素(以避免异常,因为另一个集合将为null),并且它通过实现的接口使访问变得复杂。
重载Criteria
;这样:
XOR
但是这解决了行为部分,而不是结构部分,即如何说服doSomeWork
它可以接受class WorkExcuter {
doSomeWork(Criteria criteria);
doSomeWork(RequiredInput input);
}
类型Specification
中的数据成员而不是sepc1
}
答案 0 :(得分:0)
您的条件在不同的状态下没有不同的数据,它具有计算所需的任何数据成员,并且在等待用户输入时可能未设置;有各种选项可确保在继续进行主计算之前接收用户输入。例如