适用的设计模式

时间:2013-04-16 10:30:33

标签: java jsf design-patterns

我已经有了这个工作层次结构,程序按预期运行。基本上我已经在Base类中抽象了所有内容,并且所有其他子类都添加了自己的方法。

abstract Class Base{
}

class A extends Base{
    //new methods
}

class B extends Base{
    //new methods
}

一切看起来都很好,直到以后(错误...新的要求)我意识到我需要一个新的类(让我们称之为C类) A类和B类。现在,在java中它不可能扩展两个具体的类。

class C extends A, B{
    //new methods
}

我需要A类和B类中的方法和变量,但我不知道该怎么做? 有关如何进行此更改的任何提示? 我在设计模式上不是那么好,所以我想在这里问一下。

由于

更新 这实际上是一个JSF Managed Bean,其中我在Base Managed Bean中抽象了所有内容,并且所有其他子类在基础托管bean之上覆盖/添加它们自己的实现。 只添加了一个新的要求,其中我需要将子类(A和B)的功能都放入一个新的子类(C)

4 个答案:

答案 0 :(得分:4)

重构代码并使ABBase接口而不是类,并使用接口继承而不是实现继承。
然后,您可以实现AB(这是Java支持多重继承的方式)

答案 1 :(得分:3)

使用合成或使用内部类。

class C extends A {
   B b = ... // this is one option

   class D extends B {
     // this is another option 
   }  
}

答案 2 :(得分:2)

理想情况下,您应该创建所有类A,B和Base作为接口,但正如您所提到的,上面的设计已经实现,我假设现在不是一个选项。

另一个解决方案是在C类(组合)中创建A或/和B类型的实例。

Class C{
A a=new A();
B b=new B();
}

您还可以使用继承和组合(如扩展A)和创建B实例的混合方法。

答案 3 :(得分:1)

C包含AB,但也可以extend Base进行委托,这样您就不必复制任何内容。

class C extends Base
{
   A a = new A();
   B b = new B();

   // Now delegate any implemented methods from Base to A and B

   @Override
   public void anAbstractMethod()
   {
      a.anAbstractMethod();
      b.anAbstractMethod();
   }
}