Ищете правильный шаблон. Инкапсуляция данных. Джава - PullRequest
2 голосов
/ 04 января 2011

Ищем правильный шаблон.

Предположим, у вас есть какой-то объект Data, с которым вы работаете, который подается в HistoricalData объект (когда новый Data входит и становится доступным)

Вы делаете что-то с Data и HistoricalData. Как только вы вычислите числа, вы получите множество вещей из HistoricalData. Вы хотели бы предложить доступ к данным, которые вы получили через общий класс **DerivedData**.

В настоящее время

Data (подача в) -> HistoricalData (используется для расчета) -> ClassA

Data (подача в) -> HistoricalData (используется для расчета) -> ClassB

Каждый класс доступен независимо

Я бы хотел

Data (подача) -> HistoricalData (используется) -> DerivedData (предоставление доступа) -> ClassA

Data (подача в) -> HistoricalData (используется) -> DerivedData (предоставление доступа) -> ClassB

Доступ к ClassA и ClassB возможен только через синглтон DerivedData Я бы хотел прямо запретить прямой доступ к классам ClassA и ClassB.

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

Ответы [ 4 ]

3 голосов
/ 04 января 2011

Я бы предложил рассмотреть Абстрактную фабрику или Строитель Шаблоны.

3 голосов
/ 04 января 2011

DerivedData должен быть просто интерфейсом, а не единичным.

1 голос
/ 04 января 2011

Вы можете делать все это, чтобы достичь желаемого:

  • Объявление ClassA и ClassB как внутренних классов DerivedData
  • Объявление интерфейсов ClassAInterface и ClassBInterface для сокрытия деталей ClassA и ClassB, а также даже для скрытия импорта classA & classB на стороне клиента DerivedData.
  • Заставьте DerivedData предоставить метод для возврата ClassAInterface & ClassBInterface, чтобы обеспечить доступ к функциональным возможностям classA & classB, предоставляемым через ClassAInterface & ClassBInterface.
0 голосов
/ 04 января 2011

(1) Если ClassA и ClassB можно обрабатывать единообразно, сделайте DerivedData интерфейсным / абстрактным классом, затем создайте подкласс ClassA и ClassB из DerivedData (jzd уже указывал на это). Таким образом, вы предоставляете согласованный API для своего клиентского кода через интерфейс DerivedData.

(2) Если ClassA и ClassB по своей сути различаются, а HistoricalData, а также код клиента должны обрабатывать их по-разному, шаблон Abstract Factory или Builder подходит, как уже указывал Винченцо.

Контекст импортный, ИМХО.


Вы сказали: «Я бы хотел прямо запретить прямой доступ к классам ClassA и ClassB». Насколько я понимаю, вы не хотите явно создавать экземпляры ClassA и ClassB в клиентском коде, скорее вы хотите получить их экземпляры из HistoricalData.

Не вижу смысла делать синглтон DerivedData.

...