我的问题涉及 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/

10-10 13:48