2014-12-12 3 views
0

У меня есть абстрактный класс, а некоторые классы расширяют абстрактный класс. Теперь я хотел сделать некоторую предварительную обработку перед всеми функциями, присутствующими в дочерних классах (например, , например, функции - это ничего, кроме выборки сущностей из БД, поэтому, прежде чем даже обращаться к БД, просто проверяйте сущности в кеше, если сущности присутствуют в кеше затем верните вызов else в call() или call(final Set<String> args), чтобы получить сущности, хранящие его в кеше, и вернуть). Поэтому я представил интерфейс, например.Как создать интерфейс/абстрактный класс здесь (дизайн ООП)

interface PQRCallable <K> { 
    K call(); 
    Set<K> call(final Set<String> args); 
} 

Внутри call функции функции подкласса записывает логику для извлечения сущностей из БД. Теперь каждая функция в подклассах вызывает любую из двух общих функций, присутствующих в абстрактном классе, то есть doProcessing(String k, ..., PQRCallable pQRCallable)doProcessing(Set<k>, ..., PQRCallable pQRCallable), с PQRCallable, так что если препроцессор столкнется с любой проблемой, он вернется к call() или call(final Set<String> args).

Моя проблема заключается в том, что теперь для каждой функции внутри подклассов необходимо реализовать обе функции. И doProcessing(Set<k>, ..., PQRCallable pQRCallable) всегда будет звонить Set<K> call(final Set<String> args);, а doProcessing(String k, ..., PQRCallable pQRCallable) всегда будет звонить K call();. Следовательно, на самом деле подкласс будет просто реализовывать одну функцию, а для другой функции они должны просто выбросить какое-то исключение, например UnsupportedOperationException.

Может ли кто-нибудь предложить мне лучший подход для этого. Благодарю.

+0

Можете ли вы использовать методы 'call()' и 'call (Set )' в методах интерфейса 'default'? –

+0

вы можете предоставить то, что вы сделали, или ваши коды :) TIA – Secondo

+1

вы можете реализовать этот интерфейс в своем абстрактном классе, и вы можете переопределить обе функции в абстрактном классе, чтобы он применим для всех. нет необходимости реализовывать во всех подклассах. – Prashant

ответ

0

Возможно, шаблон decorator поможет вам в этом.

Извините, что ссылка находится на C#, но есть хорошая схема UML!

+0

Мне нравится, где вы собираетесь с этим. Хотя IMO [Template Method] (http://www.dofactory.com/net/template-method-design-pattern) лучше подходит для этой проблемы. – gknicker

+0

Это, безусловно, может быть решением. Мне нравится ваше имя пользователя! – Gnucki

0

Wrap метод doProcessing:

doProcessing(String k, ...){ 
    this.pQRCallable.call(); 
    //Your processing logic 
    //It could be useful to catch the UnsupportedOperationException 
} 

doProcessing(Set<K> k, ...){ 
    this.pQRCallable.call(args);//you didn't specify how you are getting the args 
    //Your processing logic 
} 

Вы можете видеть, что pQRCallable теперь поле в вашем абстрактном классе, и вы можете установить его во время выполнения с помощью утилиты класса или с помощью конструктора конкретных подклассов.

Подклассы не должны реализовать интерфейс и во время выполнения вы будете уверены в том, что вы устанавливаете правильный PQRCallable (тот, реализации нужного вызова)

+0

Подробнее о шаблоне стратегии [здесь] (http://www.tutorialspoint.com/design_pattern/strategy_pattern.htm) – Hichamov

0

Вы можете обернуть методы БД с помощью Dynamic Доверенные. В вашем обработчике вызовов вы можете проверить, находятся ли запрошенные объекты в кеше уже. Только если они не находятся в вашем кеше, вы можете перенаправить вызов на ваш фактический объект доступа к БД.
Например, код проверки: http://tutorials.jenkov.com/java-reflection/dynamic-proxies.html

Смежные вопросы