Какой шаблон дизайна вы выберете? - PullRequest
5 голосов
/ 01 апреля 2010

Я хочу разработать класс, который содержит процедуру для достижения цели. И он должен следовать некоторому порядку, чтобы последний метод, скажем «ExecuteIt», работал правильно. в таком случае, какой шаблон дизайна вы будете использовать? который может гарантировать, что пользователь должен вызывать публичный метод в соответствии с определенным порядком.

Если вы действительно не знаете, о чем я говорю, то не могли бы вы поделиться с вами какой-то концепцией выбора шаблона дизайна или что вы будете учитывать при разработке класса?

Ответы [ 7 ]

6 голосов
/ 01 апреля 2010

Я полагаю, вы ищете шаблон Template Method.

4 голосов
/ 01 апреля 2010

Шаблонный метод - это то, что вы хотите. Это один из старейших, просто формализация способа составления ваших классов.

http://en.wikipedia.org/wiki/Template_method_pattern

или как в этом примере кода:

abstract class AbstractParent // this is the template class
{
    // this is the template method that enforces an order of method execution
   final void executeIt()
   {
     doBefore(); // << to be implemented by subclasses
     doInTheMiddle() // also to be implemented by subclasses
     doLast(); // << the one you want to make sure gets executed last
   }

   abstract void doBefore();
   abstract void doInTheMiddle();
   final void doLast(){ .... }
}

class SubA extends AbstractParent
{
   void doBefore(){ ... does something ...}
   void doInTheMiddle(){ ... does something ...}
}

class SubB extends SubA
{
   void doBefore(){ ... does something different ...}
}

Но, похоже, вы ищете возможность использовать шаблон, а не использовать шаблон для решения определенного типа проблемы. Это только приведет вас к плохим привычкам разработки программного обеспечения.

Не думай о шаблонах. Подумайте, как вы могли бы решить эту конкретную проблему, не имея шаблонов.

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

Не используйте их как формочки для печенья. Это последнее, что вы хотите сделать.

3 голосов
/ 01 апреля 2010

Простой и прагматичный подход к применению определенной последовательности шагов в любом API состоит в том, чтобы определить коллекцию классов (а не только один класс) таким образом, чтобы каждый следующий действительный шаг принимал в качестве параметра объект, полученный из предыдущего шаг, то есть:

   Fuel   coal   = CoalMine.getCoal();
   Cooker stove  = new Cooker (gas); 

   Filling apple = new AppleFilling();
   Pie applePie = new Pie(apple);

   applePie.bake(stove);

То есть, чтобы испечь пирог, вам нужно предоставить объект Cooker, который, в свою очередь, требует, чтобы сначала было создано какое-то подходящее топливо. Точно так же, прежде чем вы сможете получить пирог, вам нужно подготовить немного начинки.

В этом случае семантика использования API явно обеспечивается его синтаксисом. Сохраняйте это простым.

3 голосов
/ 01 апреля 2010

Это в основном не шаблон, но: если вы хотите убедиться, что код / ​​методы выполняются в определенном порядке, сделайте в классе только один открытый метод, который затем вызывает непубличные методы в правильной последовательности .

2 голосов
/ 01 апреля 2010

Я думаю, что вам не нужно ничего выполнять, просто подготовьте заявления, ресурсы и все, что вы хотите.Таким образом, каким бы ни был порядок, пользователь вызывает методы, которым будет гарантировано фактическое выполнение;просто потому, что у вас есть полный контроль над реальным исполнением, непосредственно перед его выполнением.

ИМХО Шаблонный метод очень мало связан с вашей целью.

РЕДАКТИРОВАТЬ: чтобы быть более понятным.Сделайте так, чтобы в вашем классе был один открытый метод Execute и ряд других открытых методов, чтобы сообщить вашему классу, что делать (когда делать это - ответственность за вас, а не за пользователя);затем сделайте несколько частных методов, выполняющих реальную работу, они будут вызваны в правильном порядке вашим Execute, как только пользователь завершит настройку.

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

0 голосов
/ 01 апреля 2010

Шаблонный метод является рациональным, если у вас есть иерархия классов, а базовый класс определяет шаги защищенной операции в своем публичном шаблонном методе. Не могли бы вы уточнить свой вопрос?

0 голосов
/ 01 апреля 2010

Как общая концепция, вы должны выбрать шаблон в качестве стандартного решения стандартной проблемы, поэтому я согласен с Одед , «Шаблонный метод» , кажется, соответствует вашим потребностям (но то, что вы объяснили, возможно, слишком мало). Не используйте шаблон как «фетиш», вам нужно помнить следующее:

  1. Как я могу изобразить мою проблему стандартным способом?
  2. Есть шаблон для этого?
  3. Это самый простой способ?
...