Шаблон проектирования для взаимодействия классов


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

В основном у меня есть два класса. Класс а занимается отображением информации пользователю, А класс В-хранением данных. Класс А должен получить данные из класса в, отформатировать их на основе внутреннего состояния класса А и вывести данные. Например Класс B содержит английские строки, и класс A всегда будет переводить эти строки на язык, заданный переменной экземпляра класса A, прежде чем приступить к их дальнейшей обработке.

Я могу предложить два возможных решения для этого, но ни одно из них не кажется очень чистым.
  1. Сделайте класс B переменной экземпляра класса A. напишите функцию в классе A, которая получает данные из класса B и форматирует их для использования в других функциях класса A. Это решение это не кажется большим, потому что это не останавливает класс а от прямого доступа к данным в классе B без форматирования его.

  2. Создайте Класс C, который расширяет класс B. сделайте Класс C переменной экземпляра класса A. Класс C переопределит геттеры класса B, чтобы форматирование всегда применялось к данным. Однако для форматирования данных классу С необходимо знать о внутреннем состоянии класса А. Это может быть достигнуто путем передачи указателя на класс A в конструктор Класс C. Класс C может затем вызвать функцию в классе A, которая вычисляет внутреннее состояние класса A.

Дайте мне знать, если это сбивает с толку, и я мог бы привести более конкретный пример.

Спасибо

3 2

3 ответа:

В альтернативе #1 я не думаю, что" остановка класса А от прямого доступа к данным в классе B без форматирования его " является проблемой. Любой класс может не делать то, что он говорит, что он делает, для этого не требуется плохой дизайн. Так что я не думаю, что это серьезное беспокойство. А-это единственная вещь, которая знает свое внутреннее состояние, поэтому она должна обеспечивать логику преобразования вывода.

Одна альтернатива этому, которая может быть чрезмерно разработана для ваших нужд, заключается в использовании чего - то вроде шаблон стратегии. В принципе, B принимает стратегию форматирования данных, и в этой функции (которую предоставит A) вы можете полагаться на состояние A.

Что-то вроде этого:

interface FormattingStrategy {
    public String format(String input);
}

class B {
    public String getFormattedStringA(FormattingStrategy formatter)...
}

class A {

    public void someMethod() {
         String a = getFormattedStringA(new FormattingStrategy() {
             public String format(String input) {
                 if (someAState) {
                    //...
                 }
             }
         };
    }
}

Стратегия может быть переменной экземпляра A. Это позволяет полностью отделить B от A, только в сочетании с интерфейсом FormattingStrategy.


одна из ошибок, которую вы делаете, - это называние классов A, B, C, вы не должны этого делать. Лучше называть ваши классы как более реальные объекты, например, как занятие или реальные вещи, потому что вы получите решение прямо из имен. Если вы упомянете о паттернах...
они имеют имена, как: модель-представление, Фабрика, декоратор, наблюдатель. выкопать его?
к вашей проблеме: класс с данными - это ваша "модель" класс, который показывает ваши данные - это ваше "представление"
Если вы имеете дело с языками, возможно, есть посмотрите на шаблон интерпретатора. Но я должен признаться, что не совсем понимаю проблему, это звучит как-то запутанно для меня