前回に続いて、今回は「Pipe」をDecoratorでやってみようと思います。題材にはログ出力処理を用いて、Decorateした分だけログ出力先が増えるようにしてみます。
では、早速コードを。
- 抽象ログクラス「AbstractLog」を作成します。
abstract class AbstractLog
{
public abstract void WriteLog(string logMessage);
}
- AbstractLogを継承した、標準出力ログクラス「StandardOutputLog」を作成します。
class StandardOutputLog : AbstractLog
{
public override void WriteLog(string logMessage)
{
Console.WriteLine(logMessage);
}
}
- 2.と同様にAbstractLogを継承し、内部にもAbstractLogのフィールドを持つデバッグ出力クラス「DebugOutputLog」を作成します。
class DebugOutputLog : AbstractLog
{
private AbstractLog abstractLog;
public DebugOutputLog(AbstractLog abstractLog)
{
this.abstractLog = abstractLog;
}
public override void WriteLog(string logMessage)
{
this.abstractLog.WriteLog(logMessage);
Debug.WriteLine(logMessage);
}
}
- 3.と同様にして、イベントログ出力ログクラス「EventOutputLog」を作成します。
class EventOutputLog : AbstractLog
{
private AbstractLog abstractLog;
public EventOutputLog(AbstractLog abstractLog)
{
this.abstractLog = abstractLog;
}
public override void WriteLog(string logMessage)
{
this.abstractLog.WriteLog(logMessage);
if ( !EventLog.SourceExists("Masaru") )
{
EventLog.CreateEventSource("Masaru", "TestLog");
}
EventLog eventLog = new EventLog();
eventLog.Source = "Masaru";
eventLog.WriteEntry(logMessage);
}
}
それでは、上記コードを実行してみましょう。
実行用コード
class Program
{
static void Main(string[] args)
{
StandardOutputLog stdOutLog = new StandardOutputLog();
stdOutLog.WriteLog("まさる");
DebugOutputLog dbgOutLog = new DebugOutputLog(stdOutLog);
dbgOutLog.WriteLog("@わんくま同盟");
EventOutputLog evtOutLog = new EventOutputLog(dbgOutLog);
evtOutLog.WriteLog("@雪国っす");
Console.ReadLine();
}
}
実行結果
ご覧のように、Decorateした出力対象にログが出力されているのが確認できます。
さて、3回にわたってDecoratorをやってきました。1回目で「業務アプリではあまりなさそうな気がしますね」とか抜かしてたのですが、いじくり回してみてきたら「めっちゃ便利♪」と今では思い直しました。今までに挙げた場合以外でも、適用できるようなケースはいくらでもありそうですね。
また、前回ちょっと書いたように、初心者、初級者さんたちに処理の詳細を見せずに色々やらせることができるってもの、結構使い道がありそうですよね。
ただ、無理してDecoratorにする必要が無い箇所でもやりかねない監事も受けましたので、そこはケースバイケースで適切に対応できるよう、今後も色々やってみることにします。
次回はFactoryパターンをやるつもりですが、その前にこれまでC#でしかコードを書いていなかったので、今までのやつを一回VBに直そうかと思ってます。
#C#読める人はVBも読める人が多いですが、逆は若干少なくなるようですので。