2014-09-25 1 views
2

мне нужно некоторые полезные предложения по дизайну шаблона для следующих проблем в Java, У меня есть три класса, как,предложения на шаблоне проектирования в Java

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

Теперь я хотел бы создать класс D, который должен повторно использовать методы DOA , doB a doC классов A, B и C соответственно.

Может ли кто-нибудь предложить мне один дизайн для вышеуказанной проблемы?

Заранее спасибо, Lakshmipathi.

+5

Важна к вашей проблеме, 'A B C' расширяет' x' и реализует 'Y'? – gontard

+4

Что такое doA, doB и doC ... связаны ли они с базовым классом X или с интерфейсом Y? –

+0

Его необходимо расширить класс X, потому что класс X будет иметь некоторые общие функции. DoA, doB и doc имеют определенные функциональные возможности по отношению к классам A, B и C. Я хотел бы повторно использовать методы doA, doB и doC в классе D каким-то образом. –

ответ

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

Я думаю, вам нужно использовать парадигму «Prefer composition over inheritance». Класс дизайна D, который включает в себя экземпляры A, B, C и при необходимости вызывать их методы. Кроме того, D может реализовать Y при необходимости и делегировать соответствующие вызовы API либо A, либо B или C.

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(); 
    } 
} 

Это может быть или не быть действительно целесообразным в зависимости от того, что вы пытаетесь сделать.

1

Это не возможно, так как оно стоит.

Лучше всего, если ваш дизайн позволит, заключается в том, чтобы воссоздать X в качестве интерфейса, а остальные в качестве интерфейсов, которые расширяют X. Это позволит D реализовать все остальные.

В противном случае, вы можете (в зависимости от того, что вы пытаетесь сделать) уйти с наличием D провести частный экземпляр A, B и C, а затем получить его делегировать методы, которые упоминают в тех случаях. Но имейте в виду, что у вас будет три разных экземпляра X, если вы сделаете это так.

Правильный ответ, вероятно, заключается в том, что ваша иерархия классов уже не совсем такая, какая она должна быть! Но в этом вопросе недостаточно подробностей.

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(); 
Смежные вопросы