【发布时间】:2019-02-23 22:04:53
【问题描述】:
假设:
- 有些模块的接口是
IA。 - 有一些模块
B,它接受IA实例的参数,其行为取决于IA的类型,
含义(伪代码,没有特定语言,[即使我使用 Python])
class B{
IA ia;
B(IA ia){
this.ia = ia;
}
doStuff(){
if(type(this.ia)==A1){
print("A1");
}
if(type(this.ia)==A2){
print("A2");
}
}
}
我意识到我可以将一些公共方法foo 添加到ia,因此代码将简化为
class B{
IA ia;
B(IA ia){
this.ia = ia;
}
doStuff(){
this.ia.foo();
}
}
我的问题有两个:
如果我(出于某种原因)无法更改
IA,实现此目的的正确设计是什么,也就是说,我无法添加foo()?如果我被允许更改
IA,那么正确(可扩展)的设计是什么,但现在A1、A2等重复出现同样的问题,意思是
最终期望的行为是
class B{
IA ia;
B(IA ia){
this.ia = ia;
}
doStuff(){
if(type(this.ia)==A1){
if(type(this.ia.iz)==Z1){
print("A1Z1");
print("unique treatment");
}
if(type(this.ia.iz)==Z2){
print("A1Z2");
print("special treatment");
}
}
if(type(this.ia)==A2){
if(type(this.ia.iz)==Z1){
print("Z1A2");
print("one of a kind treatment");
}
if(type(this.ia.iz)==Z2){
print("Z2A2");
print("Wow treatment");
}
}
}
}
并且可以重复更多次。
请注意 A1 和 A2 的 Z1 和 Z1 相同!。同样的,IZ 可以包含多种类型的IX,具有独特的行为
我想知道案例 2 是否完全独立于模块化,从某种意义上说,每个类型组合的行为都是唯一的,没有任何行为可以真正提取到更抽象的级别。
我还是不喜欢类型检查,不知道有没有可以做的更好看的东西。
【问题讨论】:
标签: oop design-patterns