Есть ли веская причина для того, чтобы полностью скрыть листовой объект в составном объекте и ограничить доступ к нему? - PullRequest
0 голосов
/ 22 августа 2011

Так, например, вот иллюстрация того, как работает текущий код. Я знаю, что это не может быть идеальным представлением композита, но я не был уверен, как еще назвать его:

public interface MyInterface {

    public void doSomething();

    public void doSomethingElse();
}

public class MyComposite implements MyInterface {

    private MyLeaf myLeaf = new MyLeaf();

    public void doSomething() {
        // Do something...
    }

    public void doSomethingElse() {
        // Do something else...
        myLeaf.doSomethingElse();
    }
}

public class MyLeaf implements MyInterface {

    public void doSomething() {
        // Do something...
    }

    public void doSomethingElse() {
        // Do something else...
    }

    public void doAnotherSomething() {
        // Do another something...
    }
}

public class Program {

    public static void main(String[] args) {

        MyComposite myComposite = new MyComposite();
        myComposite.doSomething();
        myComposite.doSomethingElse();

    // I can't do this right now...
    // myComposite.doAnotherSomething();
    }
}

Мой аргумент состоит в том, чтобы просто полностью открыть доступ к конечному объекту и просто вернуть экземпляр, и тогда вызывающий код может делать с ним все, что угодно. Однако я хочу знать, будут ли в этом недостатки.

1 Ответ

2 голосов
/ 22 августа 2011

Это говорит о том, что с вашим дизайном что-то не так. То, что вы говорите, - это то, что метод ниже в вашей иерархии наследования должен быть виден выше. Ваш интерфейс должен выражать все операции, которые могут быть выполнены в реализациях. Кроме того, вашим примером может быть Адаптер , а не Composite .

...