我确信有更多OO方式可以做到这一点,但我不确定如何。 我有不同的“报告”对象(例如Report1,Report2,Report3等)。 我有一个服务对象,它将这些报表对象作为方法中的两个参数。 在方法中,我有一个大的if else块语句,用于确定哪两个报表对象已传递给方法。这个逻辑似乎不是OO,没有更好的方法来确定我传入哪两个报告,然后为这两个报告提供正确的逻辑,所以我没有一个if-else块,螺旋式的控制并最终长达100多行?命令模式在这里运作良好还是有更好的东西更加以对象为中心?
Report1 r1 = new Report1();
Report2 r2 = new Report2();
Report3 r3 = new Report3();
Report4 r4 = new Report4();
etc...
SomeServiceObject serviceObj = new SomeServiceObject();
var returnedData1 = serviceObj.GetReportLogic(r1, r2);
var returnedData2 = serviceObj.GetReportLogic(r1, r3);
var returnedData3 = serviceObj.GetReportLogic(r3, r4);
etc..
public GetReportLogic(object someReport1, object someReport2)
{
if ((someReport1 as Report1) and (someReport2 as Report1))
{
DoSomething();
}
else if ((someReport1 as Report1) and (someReport2 as Report2))
{
DoSomethingElse();
}
else if ((someReport1 as Report1) and (someReport2 as Report3))
{
DoSomethingElseAgain();
}
etc...
}
答案 0 :(得分:8)
好的,我的C#有点生疏,但是你不能用方法重载来实现这个目的吗?即限定 多种方法
public GetReportLogic(Report1 someReport1, Report1 someReport2)
public GetReportLogic(Report1 someReport1, Report2 someReport2)
public GetReportLogic(Report2 someReport1, Report2 someReport2)
...
对不同的参数有不同的实现吗?
您还可以在报告类中定义一个名为,例如,合并(报告r)的方法,然后每个报告定义它与不同其他报告的组合方式。
答案 1 :(得分:0)
检查Chain of responsibility pattern是否适合您(元代码):
public class ChainOfResponsibility
{
ChainOfResponsibility _next;
Type _t1;
Type _t2;
Action _action;
public ChainOfResponsibility(Type t1, Type t2, Action action)
{
_t1 = t1;
_t2 = t2;
_action = action;
}
public void Execute(object o1, object o2)
{
if(CriteriaMatches(o1, o2))
{
_action();
return;
}
if(_next != null)
_next.Execute(o1,o2);
}
public ChainOfResponsibility SetNext(Type t1, Type t2, Action action)
{
_next = new ChainOfResponsibility(t1,t2,action);
return _next;
}
private bool CriteriaMatches(object o1, object o2)
{
return (o1 as t1) and (o2 as t2);
}
}
用法将是:
public GetReportLogic(object someReport1, object someReport2)
{
var chain = new ChainOfResponsibility(typeof(Report1), typeof(Report1), DoSomething)
.SetNext(typeof(Report1), typeof(Report2), DoSomethingElse)
.SetNext(typeof(Report1), typeof(Report3), DoSomethingElseAgain);
chain.Execute(someReport1, someReport2);
}
我为您提供的代码编写了模式的变体。随意根据您的实际需要进行调整。