Несколько интерфейсов, расширяющихся в Java - PullRequest
1 голос
/ 10 апреля 2011

Мне нужно реализовать шаблон проектирования Facade с множественным наследованием интерфейсов в Java или, если быть точным, шаблон проектирования Facade with Bridge. Я знаю, что это возможно, потому что я видел это как часть одной системы, но я не очень хорошо помню реализацию.
Вот моя реализация до сих пор:

public interface IOne {
public void methodOneIOne();
public void methodTwoIOne();
}

И его реализация:

public class One implements IOne {
@Override
public void methodOneIOne() {
    System.out.println("methodOneIOne()");
}
@Override
public void methodTwoIOne() {
    System.out.println("methodTwoIOne()");
}  }


public interface ITwo {
public void methodOneITwo();
public void methodTwoITwo();
}
public class Two implements ITwo {
@Override
public void methodOneITwo() {
    System.out.println("methodOneITwo()");
}
@Override
public void methodTwoITwo() {
    System.out.println("methodTwoITwo()");
}}

И фасад:

public interface IFacade extends IOne, ITwo {}

Итак, отсюда я не знаю, куда идти. Если я создам класс, который реализует IFacade, то потребуется реализовать все методы, а это не то, что я хочу.

Ответы [ 2 ]

9 голосов
/ 10 апреля 2011

Если я создаю класс, который реализует IFacade, то если потребуется реализовать все методы, и это не то, что я хочу.

Почему бы и нет? Что ты хочешь, чтобы Фасад делал?

Реализация Facade, как написано, должна была бы реализовать все методы, но это не обязательно означает повторение всего кода, который вы написали для One и Two. Просто используйте состав:

public class Facade implements IFacade
{
    private IOne one;
    private ITwo two;

    public Facade(IOne one, ITwo two)
    {
        this.one = one; 
        this.two = two;    
    }

    @Override
    public void methodOneIOne() 
    {
        this.one.methodOneInOne(); 
    }

    // You see the point, I hope.

}

У этого дизайна есть дополнительное преимущество, позволяющее вам изменять реализации вашего Фасада по своему желанию: просто заменять различные реализации каждого интерфейса. Это могут быть динамически генерируемые прокси или что-то еще, что вы можете придумать. В этом прелесть проектирования интерфейса.

1 голос
/ 10 апреля 2011

Что вы на самом деле пытаетесь сделать с вашим классом фасадов? Если вы просто пытаетесь пройти через большинство методов, возможно, изменив несколько, тогда вам может понадобиться динамический прокси .

В противном случае вам фактически придется реализовать все методы IFacade, поскольку Java не позволяет использовать множественное наследование, поэтому вы не можете расширять как One, так и Two.

...