Шаблон проектирования адаптера: Предоставить частный экземпляр адаптера класса Adapter. За исключением кода клиента? - PullRequest
0 голосов
/ 27 марта 2019

Можно ли как-нибудь открыть частный экземпляр adaptee внутри класса Adapter, когда он мне понадобится, кроме клиентского кода?

Чтобы уточнить, есть определенные случаи, когда я хотел бы выставить экземпляр адаптера из Адаптера для общественности, но я не хочу делать это с клиентским кодом.Поэтому было бы целесообразно написать метод внутри класса Adapter, такой как этот:

public Adaptee ExposeAdaptee(){
    return _adapteeInstance;
}

enter image description here

1 Ответ

2 голосов
/ 28 марта 2019

Это называется разоблачение делегата . Хотя это действительно в некоторых случаях (выходящих за рамки этого ответа), это обычно не рекомендуется, поскольку оно нарушает закон Деметры и, следовательно, инкапсуляцию. Я бы не рекомендовал это. Основная идея любой абстракции - скрывать детали; Шаблон адаптера ничем не отличается. В этом случае мы скрываем интерфейс делегата за тем, который ожидает клиент. Раскрытие делегата клиенту позволит обойти эту абстракцию, наделяя ее множеством противоречивых обязанностей - не очень хорошее дизайнерское решение.

Если клиенту нужен делегат, а также адаптер, это не должно быть проблемой, потому что клиент все равно передает экземпляр делегата конструктору адаптера. Теперь, если вы говорите, что другим клиентам нужен доступ к тому же экземпляру делегата, тогда это совсем другой вопрос, и вы можете использовать другие шаблоны / решения (Singleton или перевод экземпляра в общую зависимость).

В любом случае, надеюсь, это поможет!

...