2016-04-08 3 views
0

Я читал о шаблоне прокси-сервера Java и обработчике вызова, и везде видно, что конкретная конструкция класса доступна клиенту.Прокси-шаблон конкретный класс скрывает детали реализации

Например,

//TwitterService service = (TwitterService) SecurityProxy.newInstance(new TwitterStub()); 
TwitterService service = new TwitterStub(); 
System.out.println(service.getTimelinePosts("abc")); 

Пользователь может создать экземпляр TwitterStub непосредственно и получить доступ к методам. Мне было интересно, есть ли способ не подвергать или избегать строительства конкретного класса через клиента?

Есть ли лучший способ?

+0

Вам необходимо обеспечить реализацию InvocationHandler, больше ничего не требуется. –

+1

Вы можете использовать [Заводской шаблон метода] (https://en.wikipedia.org/wiki/Factory_method_pattern) или [Абстрактный заводской шаблон] (https://en.wikipedia.org/wiki/Abstract_factory_pattern), чтобы скрыть прямой вызов вашего конструктора. – callyalater

+0

Но я не думаю, что я вполне понимаю ваш вопрос ... – callyalater

ответ

1

Как полагает GoF, целью прокси-шаблона является «предоставление суррогата или заполнителя для другого объекта для контроля доступа к нему».

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

Если вы хотите, это уровень косвенности, вы можете использовать шаблон абстрактной фабрики, который возвращает разные типы прокси-объектов. Но до сих пор причина прокси-объектов - действовать от имени других объектов.

В качестве побочного примечания прокси-серверы полезны, когда у вас есть объекты, которые дорогие для создания, но вы не хотите, чтобы из-за таких расходов искажалась основная функция приложения. Например, предположим, что у вас есть документ с 1000 изображениями. Вы можете использовать прокси-серверы для них и загружать их только при строгой необходимости (т. Е. Когда они находятся в видимом виде), и вы можете быстро загрузить полный документ без накладных расходов при чтении 1000 изображений одновременно.