在java中使用数百个实现业务规则的设计模式

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (119)

我必须用几百行以下代码来实现某些业务规则

if this
      then this
else if
      then this
.
. // hundreds of lines of rules
 else
      that

我们是否有任何设计模式可以有效地实现或重用代码,以便它可以应用于所有不同的规则。我听说过创建类似于下面的规范模式

public interface Specification {

boolean isSatisfiedBy(Object o);

Specification and(Specification specification);

Specification or(Specification specification);

Specification not(Specification specification);
}


public abstract class AbstractSpecification implements Specification {

public abstract boolean isSatisfiedBy(Object o);

public Specification and(final Specification specification) {
 return new AndSpecification(this, specification);
}

public Specification or(final Specification specification) {
 return new OrSpecification(this, specification);
}

 public Specification not(final Specification specification) {
 return new NotSpecification(specification);
}
}

然后执行Is,或者方法,但我认为这不能救我写if if else(可能是我的理解不正确)...

有没有最好的方法来实施这样的业务规则,这么多的陈述呢?

只是一个示例example.A,B,C等是一个类的属性。除了这些还有类似的很多其他规则。我想为此做一个通用代码。

    If <A> = 'something' and <B> = ‘something’ then
    If <C> = ‘02’ and <D> <> ‘02’ and < E> <> ‘02’  then
        'something'
    Else if <H> <> ‘02’ and <I> = ‘02’ and <J> <> ‘02’  then
        'something'
    Else if <H> <> ‘02’ and <I> <> ‘02’ and <J> = ‘02’  then
        'something'
    Else if <H> <> ‘02’ and <I> = ‘02’ and <J> = ‘02’  then 
        'something'
    Else if <H> = ‘02’ and <I> = ‘02’ and <J> <> ‘02’  then 
        'something'
    Else if <H> = ‘02’ and <I> <> ‘02’ and <J> = ‘02’  then 
        'something'
    Else if <H> = ‘02’ and <I> = ‘02’ and <J> = ‘02’  then:
        If <Q> = Y then
            'something'
        Else then 
            'something'
Else :
Value of <Z>
提问于
用户回答回答于

您可以使用命令模式工厂模式

可以使用命令模式来替换繁琐的开关/如果块添加新选项时会无限增长。

public interface Command {
     void exec();
}

public class CommandA() implements Command {

     void exec() {
          // ... 
     }
}
// etc etc

然后构建一个Map<String,Command>对象并用Command实例填充它:

commandMap.put("A", new CommandA());
commandMap.put("B", new CommandB());

那么你可以用你的if / else if链取代:

commandMap.get(value).exec();

工厂模式中,您可以将工厂中的if /开关包含在工厂中,以便处理丑陋并隐藏丰富的if。 工厂模式的示例代码

用户回答回答于

扫码关注云+社区