Oop 被调用方根据调用方类型执行操作
我想知道,除了下面的模式外,是否还有其他更好的模式,其中一个对象将自身作为上下文传递给另一个对象,而另一个对象反过来使用上下文或缺少作为逻辑来构建必要的输出。我已经尝试将调用者/发送者设置为接口并将其自身作为接口传递,但真正的问题是,被调用对象甚至知道其调用者是谁,也就是说,将其与其他调用者区分开来,并在必要时采取单独的操作,这是否是一种良好的做法?我是不是少了一块拼图Oop 被调用方根据调用方类型执行操作,oop,Oop,我想知道,除了下面的模式外,是否还有其他更好的模式,其中一个对象将自身作为上下文传递给另一个对象,而另一个对象反过来使用上下文或缺少作为逻辑来构建必要的输出。我已经尝试将调用者/发送者设置为接口并将其自身作为接口传递,但真正的问题是,被调用对象甚至知道其调用者是谁,也就是说,将其与其他调用者区分开来,并在必要时采取单独的操作,这是否是一种良好的做法?我是不是少了一块拼图 Caller (CGQuery): public string RenderForLoop()
Caller (CGQuery):
public string RenderForLoop()
{
...
sb.Append(string.Join("",this.ContentIsCGExpressions.Select(exp => exp.GetProcessedExpression(this))));
...
Callee (CGExpression):
public string GetProcessedExpression(object context = null)
{
...
retv = ReplaceCodes(retv, context);
...
private string ReplaceCodes(string retv, object context = null)
{
... retv = ReplaceContextSequenceCode(retv, context);
return retv;
}
...
private string ReplaceContextSequenceCode(string retv, object context = null)
{
var _regx = new Regex("(?i)<q_ctx_seq>");
var _matchresult = _regx.Match(retv);
while (_matchresult.Success)
{
string replacement = FetchContextSequenceQueryTableFieldExpression(context);
retv = retv.Replace(_matchresult.Groups[0].Value, replacement);
_matchresult = _matchresult.NextMatch();
}
return retv;
}
private string FetchContextSequenceQueryTableFieldExpression(object context = null)
{
if (context != null && context is CGQuery)
{
return ((CGQuery)context).FetchContextSequenceQueryTableFieldExpression();
}
return this.CGStatementsUsedAsParamsFor.Any() ?
this.CGStatementsUsedAsParamsFor.Single().FetchContextSequenceQueryTableFieldExpression(context)
:
this.CGQueriesContentFor.Single().FetchContextSequenceQueryTableFieldExpression();
}
抱歉,我不知道如何突出显示主块中的代码。让调用者向被调用者传递包含要执行的操作的对象怎么样?可以在此操作中查询调用者,而被调用者不知道其存在
一般来说,我会说,决定调用对象类的行为不是一个好的OOP实践。正如您所说,我考虑了委托;那么,您是说委托应该是GetProcessedExpression的非可选参数吗?或者我可能完全搞错了,GetProcessedExpression作为一个入口点太通用了。也许在这个调用者和被调用者之间应该有其他类?…事实上,我认为更多的是策略模式或访问者,这取决于控制流。委派意味着将任务交给另一个类(如中央服务或类似服务)。在本例中,您将移交负责执行所需操作的对象本身。
if (context != null && context is CGQuery)
{
return ((CGQuery)context).FetchContextSequenceQueryTableFieldExpression();
}