Шаблон проектирования для взаимодействия классов - PullRequest
2 голосов
/ 13 октября 2010

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

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

Я могу предложить два возможных решениядля этого, но ни один из них не кажется очень чистым.

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

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

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

спасибо

Ответы [ 3 ]

3 голосов
/ 13 октября 2010

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

Одной альтернативой этому, который может быть слишком силен для ваших нужд, является использование чего-то вроде шаблона Стратегии. По сути, 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.

0 голосов
/ 13 октября 2010


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

0 голосов
/ 13 октября 2010
...