4

我确信有更多的面向对象的方法可以做到这一点,但我不确定如何。我有不同的“报告”对象(例如 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...
}
4

2 回答 2

8

好的,我的 C# 有点生疏了,但是你不能使用方法重载来实现这个吗?即定义多个方法

public GetReportLogic(Report1 someReport1, Report1 someReport2)
public GetReportLogic(Report1 someReport1, Report2 someReport2)
public GetReportLogic(Report2 someReport1, Report2 someReport2)

...

对不同的论点有不同的实现?

您还可以在 Report 类中定义一个名为 combine(Report r) 的方法,然后每个 Report 定义它与其他不同报告的组合方式。

于 2013-06-16T02:12:08.840 回答
0

检查责任链模式是否适合您(元代码):

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);
}

我为您提供的代码编写了模式的变体。随意调整它以适应您的实际需求。

于 2013-06-18T12:05:52.693 回答