关于java中设计模式的建议

时间:2014-09-25 12:34:10

标签: java design-patterns

我需要对Java中的以下问题的设计模式提出一些有用的建议。

我有三个班级:

class A extends X implement Y {
    doA()
}
class B extends X implement Y {
    doB()
}
class C extends X implement Y {
    doC()
}

现在我想创建一个类D,它应该重用类doAdoB的方法doCAB以及分别为C

有人可以为上述问题提出设计建议吗?

5 个答案:

答案 0 :(得分:4)

我认为你需要使用范例" Prefer composition over inheritance"。设计类D,其中包含ABC的实例,并根据需要调用其方法。此外,D可以在必要时实施Y,并将相应的API调用委托给ABC

答案 1 :(得分:1)

这不是直接可行的。

如果您的设计允许,最好的选择是重新创建X作为接口,其他作为扩展X的接口。这将允许D实施所有其他。

如果做不到这一点,您可能会({1}}拥有DAB的私有实例,这取决于您尝试做的事情,然后让它将你提到的方法委托给那些实例。但请记住,如果您这样做,您将有三个不同的C个实例。

正确的答案可能是您的类层次结构已经不是它应该是的了!但问题还不够确定。

答案 2 :(得分:1)

您可以尝试这样的事情:

class A extends X implement Y{
  doA()
}
class B extends X implement Y{
  doB()
}
class C extends X implement Y{
   doC()
}

interface Delegator { 
    doSomething();
}

class DBuider {

    public DBuider with(Delegator d) {
        // create chain and store it
        return this;
    }

    Chain build() {
        // return new D with resulted chain
    }

    class Chain {
        Delegator del;
        Chain next;
    }
}

class D implements Y {
    Chain c;

    static DBuilder create() {
        return new DBuilder();
    }

    doD() {
        Chain t = c;
        while (t != null) {
            t.del.doSomething();
            t = t.next;
        }
    }
}

----- Usage -----

D.create().with(() -> new A().doA()).with(() -> new B().doB()).build().doD();

答案 3 :(得分:0)

您可以从现有的课程中撰写新的课程D:

class D {
    private A a = new A();
    private B b = new B();
    private C c = new C();

    public void foo() {
        this.a.doA();
        this.b.doB();
        this.c.doC();
    }
}

答案 4 :(得分:0)

在不知道所有细节的情况下,这感觉就像是一个构图问题。

Class D
{
   private A _a = new A();
   private B _b = new B();
   private C _c = new C();

   doA()
   {
      _a.doA();
   }

   doB()
   {
     _b.doB();
   }

   doC()
   {
     _c.doC();
   }
}

根据您的目的,这可能是也可能不合适。