Callee根据来电者的类型采取行动

时间:2014-02-21 13:01:01

标签: oop

我想知道是否存在除下面之外的一些替代更好的模式,其中一个对象将自身作为上下文传递给另一个对象,而另一个对象又使用上下文或缺少逻辑来构建必要的输出。我已经尝试将调用者/发送者作为接口并将其自身作为接口传递,但真正的问题是被调用对象甚至知道其调用者是谁,即将其与其他调用者区分开来并在必要时采取单独操作的良好实践?我错过了拼图吗?

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

上面的这一行是我关注的(似乎违反了封装?)

        if (context != null && context is CGQuery)
        {
            return ((CGQuery)context).FetchContextSequenceQueryTableFieldExpression();
        }
抱歉,我不知道如何突出显示主要块中的代码。

1 个答案:

答案 0 :(得分:0)

让调用者将一个对象传递给包含要执行的操作的被调用者怎么样?可以在此操作中查询调用者,而被调用者不知道其存在。

一般来说,我会说在决定调用对象的类上的行为是不好的OOP练习。