Помощь шаблона проектирования принятия решений - PullRequest
0 голосов
/ 25 июня 2010

У меня есть ситуация, когда (псевдокод):

Action a;
Object o;
if(objectIsPartOfGroup(o, "Group1"))
  a = treatCaseGroup1();
if(a != indecisive)
  return a;

if(objectIsPartOfGroup(o, "Group2"))
  a = treatCaseGroup2();
if(a != indecisive)
  return a;

if(objectIsPartOfGroup(o, "Group3"))
  a = treatCaseGroup3();
if(a != indecisive)
  return a;
.
.
.

Мне было интересно, есть ли шаблон, применимый к этой ситуации, чтобы мне не пришлось повторять "if (a! = нерешительно) вернуть; "проверять после каждого шага?Я считаю, что повторять этот код снова и снова не очень ... профессионально?Он добавляет много строк кода и совсем не помогает ясности, поэтому я считаю, что это отстой.

РЕДАКТИРОВАТЬ: объект может быть частью group1 и group2 и group3, и т. Д ... так сказатьобъект является частью группы 1, и действие не является решающим, поскольку оно также является частью группы 2, оно будет обрабатываться снова и снова, пока не будут обработаны все группы.В конце концов, результат МОЖЕТ быть и нерешительным!

Спасибо за вашу помощь!

Дэйв

Ответы [ 4 ]

3 голосов
/ 26 июня 2010
public Action determimeAction( Object o, List<String> groups ) {
    for ( String group : groups ) {
        if ( ( ( GroupI ) o ).isPartOf( group ) ) {
            Action a = ( ( GroupI ) o ).treatCaseGroup( group );
            if ( a != indecisive ) {  // could this be a.isDecicive()
                return a;
            }
        }
    }
    return null; // or whatever
}

public interface GroupI () {
    public Action treatCaseGroup( String group );   // is implemented to know which Action to get.
    public Boolean isPartOf( Stirng group ); // is implemented the same as your example just move the method to your object
}

public class GroupImpl implements GroupI {
    public Boolean isPartOf( Stirng group ) {
    }
    public Action treatCaseGroup( String group ) {
        // use if, case, factory, or Dep Inection to get the correct action.
    }
}

Не зная всей логики, что-то подобное должно работать.

2 голосов
/ 25 июня 2010

Проверьте Шаблон дизайна посетителя .

По сути, шаблон Visitor предназначен для выполнения различных операций над различными статическими объектами без их слишком жесткого связывания.

Для правильного рефакторинга вашего кода вы просто сделаете:

o.treat();
0 голосов
/ 06 апреля 2016

Взгляните на цепь ответственности. Вы разделяете ответственность каждого метода Treat, устанавливаете цепочку команд. Каждая команда попытается обработать объект.

Посмотрите здесь: http://www.dofactory.com/net/chain-of-responsibility-design-pattern

0 голосов
/ 25 июня 2010

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

Action a;
Object o;

while (a == indecisive)
{
    if(objectIsPartOfGroup(o, "Group1"))
        a = treatCaseGroup1();
    if(objectIsPartOfGroup(o, "Group2"))
        a = treatCaseGroup2();
    if(objectIsPartOfGroup(o, "Group3"))
        a = treatCaseGroup3();
 }

 return a
...