使用不相关类的相关类的有效设计

时间:2016-08-18 22:55:06

标签: java design-patterns

我有以下情况,想知道设计解决方案的最佳方法

public abstract class A {
  public abstract A getHelper();
  public abstract void launchHandle();  
  public static A initHelper(String condition) throws Exception {
      if ( condition == 'xyz') {
         return C.getHelper();
      } else {
          return B.getHelper();
      }
  }
}

public class B extends A {
  protected static A b;

  @Override
  public A getHelper() {
    b = new B();
    return b;
  }

 @Override
  public void launchHandle() {
   System.out.println("Launching Handle");
  }

  public String getName() {
   return "I am from Class B";
  }
}

public class C extends A {
  protected static A c;

  @Override
  public A getHelper() {
    c = new C();
    return c;
  }

 @Override
  public void launchHandle() {
   System.out.println("Launching Handle from C");
  }

  public String getValue() {
   return "I am from Class C";
  }
}

**Executor class**

public class Executor {

  public static void main(String[] args) {
      A aa = a.initHelper(condition);
   }
}

现在在上面的方法中,我无法从类C中访问类似aa.getName()的方法或从类C中访问aa.getValue(),这是有道理的。但是如何在执行器类中获取这些方法?执行人对B类和B类没有任何了解。 C并不应该知道。 Executor只知道A类,但想要访问B& S中的方法SubClass方法。 C从A类延伸。

请帮助设计这个以及解决此问题的最佳方法。

提前致谢。

2 个答案:

答案 0 :(得分:2)

  

Executor只知道A类,但想要访问B& B的方法SubClass方法。 C从A类延伸。

如果仔细查看代码,您会注意到所有类中唯一的合同常量是launchHandle方法(仅仅使用了getHelperinitHelper。用于实例化正确的子类)。 BC之间没有真正的关系,除了它们的实例化由A控制。

这就是我考虑解决问题的方法:

执行工厂

Executor成为abstract课程,而不是将其作为课程的入口点:

public abstract class Executor {
    public abstract void performTask();
    public static void execute(String condition) {
       Executor executor = null;
       if ( condition.equals("xyz")) {
          executor = new AExector();
       } else {
          executor = new BExecutor();
       }
       executor.performTask();
    }

}

执行人实施

为名为B的{​​{1}}操作创建不同的实现:

BExecutor

为名为public class BExecutor extends Executor { public void performTask() { System.out.println("launching handle from B"); //create or get data to perform the task on B b = new B(); String name = b.getName(); System.out.println("I am from "+name); } } 的{​​{1}}操作创建不同的实现:

C

您的主要方法可能如下所示:

CExecutor

出于某种原因,如果您确实在public class CExecutor extends Executor { public void performTask() { System.out.println("launching handle from C"); //create or get data to perform the task on C c = new C(); String value = c.getValue(); System.out.println("I am from "+value); } } public static void main(String []args) { Executor executor = Executor.execute(condition); } 之间找到了一些常见合同,那么您始终会创建一个B Cinterface }可以实现和使用此B的引用,而不是使用Cinterface引用。

答案 1 :(得分:1)

将getName和getValue作为抽象方法添加到A.