依存するロジックを独自の操作に移動することをお勧めします。
abstract Operation
{
abstract ? Execute(? arg); // override in subclass to do work
}
abstract PostProcessOperation : Operation
{
Operation _sourceOp;
Operation(Operation sourceOp)
{
_sourceOp = sourceOp;
}
override ? Execute(? arg)
{
? sourceResult = _sourceOp.Execute(arg);
return PostProcess(sourceResult);
}
abstract ? PostProcess(? arg); // override in subclass to do work with results of the source op Execute
}
次に、たとえば、処理後のコンソール ロギングを操作に追加するには、次のようにします。
class ResultLogOp : PostProcessOperation
{
override ? PostProcess(? arg)
{
Console.Writeline(arg.ToString());
}
}
例をさらに進めるために、ファイルの削除操作があり、その成功をログに記録して後処理したいとします。
DeleteFileOp deleteFile = DeleteFileOp(fileToDelete);
ResultLogOp loggedDeleteFile = new ResultLogOp(deleteFile);
operations.Enque(loggedDeleteFile);
または、使用方法が異なる場合は、タイプに基づいて追加された特定のキー操作をコンテナー クラスでラップできる可能性があります。
void Add(Operation child)
{
if (child is ImportantType)
{
_operations.Add(new ResultLogOp(child); // add logging transparently on the fly
}
}
このコンセプトのバリエーションは無限大です。