我的问题涉及 OOP 中的类设计。假设我们有 ItemBase,它是取消、修改和添加类的父类。我们还有 DueToBase 类 - Provider 和 Distributor 的父类。
由于 DueToBase 类,ItemBase 可能会更改。
假设ItemBase 具有DueToBase 类型的属性,并且DueToBase 具有名为compute() 的接口(interface)方法。计算算法是 与特定 ItemBase 派生类相关的 。所以我们有 ItemBase-DueToBase 关系的六种不同可能的组合。
例子。
ItemBase ib = new Added();
ib.changed = new Provider(ib);
ib.changed.compute();
我的问题是在真正的面向对象编程中应该如何构建 ItemBase 和 DueToBase 之间的关系?我在用于检查实例 ItemBase 是哪种类型的计算方法中没有看到 swich/case 或 if 条件子句。
如果 DueToBase 有另一个 XXXBase 类,其中有另一个接口(interface)方法 YYY() ,则情况会更糟,该算法取决于 DueToBase 的特定实例(甚至在 ItemBase 上)。
遇到此类情况如何处理?这些东西有什么好的编程模式吗?也许我遵循的方向很糟糕。我将不胜感激您的帮助。
可能是我的图不清楚。问题在于以下...
伪代码:
doSomething(){
if(itemBase instanceof Cancelled){
if(dueToBase instanceof Provider)
algorithm1();
else if(dueToBase instanceof Company)
algorithm2();
}else if(itemBase instanceof Modified){
if(dueToBase instanceof Provider)
algorithm3();
else if(dueToBase instanceof Company)
algorithm4();
}else if(itemBase instanceof Added){
if(dueToBase instanceof Provider)
algorithm5();
else if(dueToBase instanceof Company)
algorithm6();
}
}
如果使用更深的 if 子句,情况会变得更糟。
最佳答案
更好的方法是:
interface Algorithm {
void executeAlgorithm();
}
并且有实现算法接口(interface)的类,而不是函数。算法 1、算法 2、算法 3 等。
并有表:
Algorithm[,] algorithmTable = { { new Algorithm1(), new Algorithm2() },
{ new Algorithm3(), new Algorithm4() },
{ new Algorithm5(), new Algorithm6() }
};
并有 map
Map< Class<?> , Integer > itemBaseMap = new HashMap<>();
Map< Class<?> , Integer > dueToBaseMap = new HashMap<>();
并在某处构建此 map
itemBaseMap.add( Canceled.class , 0 );
itemBaseMap.add( Modified.class , 1 );
itemBaseMap.add( Added.class , 2 );
dueToBaseMap.add( Provider.class, 0 );
dueToBaseMap.add( Company.class, 1 );
在 doSomething 方法中你可以写
void doSomething( ItemBase itemBase, DueToBase dueToBase ) {
Integer itemBaseIndex = itemBaseMap.get( itemBase.getClass() );
Integer dueToBaseIndex = dueToBaseMap.get( dueToBase.getClass() );
Algorithm algorithm = algorithmTable[ itemBaseIndex, dueToBaseIndex ];
algorithm.executeAlgorithm();
}
关于java - OOP 类设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11551973/