Шаблон проектирования использовать, когда вы хотите применить некоторые общие функции для некоторых конкретных методов? - PullRequest
2 голосов
/ 23 июня 2019

Я пытаюсь выяснить шаблон проектирования, который можно использовать (если таковой существует) в ситуации, когда я буду перерабатывать некоторые функции для нескольких классов.Ниже приведен (упрощенный) обзор проблемы, с которой я столкнулся:

У меня есть некоторый Java-код для CREATE, UPDATE, DELETE Student объектов, Professor объектов и & Staff объектов.И каждый раз, когда такой объект создается, удаляется или обновляется, я хочу извлечь некоторую информацию о затронутом объекте (например, имя, возраст, идентификатор) и уведомить внешнюю службу.Так что-то вроде:

class StudentDAO {
   public Student createStudent(Student studentToCreate) {
       jdbcTemplate.update(INSERT_SQL, .....);
       //===> extract some info of the student
       //let external service know a student was created....
   }
   public Student deleteStudent(Student studentToDelete) {
       jdbcTemplate.update(DELETE_SQL, .....);
       //===> extract some info of the student
       //let external service know a student was deleted....
   }
   //same thing for update
}

class ProfessortDAO {
   public Professor createProfessor(Professor professorToCreate) {
       jdbcTemplate.update(INSERT_SQL, .....);
       //===> extract some info of the professor
       //let external service know a Professor was created....
   }
   public Student deleteProfessor(Professor professorToDelete) {
       jdbcTemplate.update(DELETE_SQL, .....);
       //===> extract some info of the professor
       //let external service know a professor was deleted....
   }
   //same thing for update
}

//repeat for Staff

Пример немного надуман, но предположим, что Student, Professor, Staff не имеют общего супертипа.Есть ли способ реализовать эту функцию, не копируя и не вставляя логику для извлечения информации и отправки ее во все классы DAO для методов CREATE, DELETE, UPDATE?

Ответы [ 4 ]

0 голосов
/ 24 июня 2019

Вам следует искать общий репозиторий.Вы можете узнать больше здесь:

https://www.youtube.com/results?search_query=generic+repository+java

Пример кода:

class Reposiory<T> {
   public T create(T Create) {
       jdbcTemplate.update(INSERT_SQL, .....);
   }
   public T delete(T Delete) {
       jdbcTemplate.update(DELETE_SQL, .....);
   }

}
0 голосов
/ 23 июня 2019

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

0 голосов
/ 23 июня 2019

Не так много информации, чтобы продолжить, но рассматривали ли вы вопрос об использовании generics для определенного типа и реализации interface для определения общей информации (phone, name, id), к которой вы хотите получить доступ от каждого типа индивидуума?

Вы также должны быть в состоянии передать операцию (DELETE, ADD, UPDATE) в качестве аргумента.Я бы предложил использовать для этого enum.

0 голосов
/ 23 июня 2019

Создать интерфейс ReportExternalService и добавить ключевое свойство, Реализуйте этот интерфейс, если объект требует уведомления.

Создайте один метод, который принимает параметр как ReportExternalService, и используйте ключ для отправки отчетов во внешнюю службу.!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...