まさるblog

越後在住子持ちプログラマー奮闘記 - Author:まさる(高野 将、TAKANO Sho)

目次

Blog 利用状況

ニュース

著書

2010/7発売


Web掲載記事

@IT

.NET開発を始めるVB6プログラマーが知るべき9のこと

CodeZine

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

第1回 3層データバインドを正しく活用しよう(前編)

ブログパーツ


書庫

日記カテゴリ

コミュニティ

デザインパターンを学ぶ~その8:Decoratorパターン(3)~

前回に続いて、今回は「Pipe」をDecoratorでやってみようと思います。題材にはログ出力処理を用いて、Decorateした分だけログ出力先が増えるようにしてみます。

では、早速コードを。

  1. 抽象ログクラス「AbstractLog」を作成します。
    C# Code
    // 抽象ログクラス
    abstract class AbstractLog
    {
        public abstract void WriteLog(string logMessage);
    }
    
  2. AbstractLogを継承した、標準出力ログクラス「StandardOutputLog」を作成します。
    C# Code
    // 標準出力ログクラス
    class StandardOutputLog : AbstractLog
    {
        public override void WriteLog(string logMessage)
        {
            Console.WriteLine(logMessage);
        }
    }
    
  3. 2.と同様にAbstractLogを継承し、内部にもAbstractLogのフィールドを持つデバッグ出力クラス「DebugOutputLog」を作成します。
    C# Code
    // デバッグ出力ログクラス
    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);
        }
    }
    
  4. 3.と同様にして、イベントログ出力ログクラス「EventOutputLog」を作成します。
    C# Code
    // イベントログ出力ログクラス
    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);
        }
    }
    

それでは、上記コードを実行してみましょう。

実行用コード

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

実行結果

  • 標準出力
     StandartOutput
  • デバッグ出力
    DebugOutput
  • イベントログ
    EventOutput1

    EventOutput2

ご覧のように、Decorateした出力対象にログが出力されているのが確認できます。

 

さて、3回にわたってDecoratorをやってきました。1回目で「業務アプリではあまりなさそうな気がしますね」とか抜かしてたのですが、いじくり回してみてきたら「めっちゃ便利♪」と今では思い直しました。今までに挙げた場合以外でも、適用できるようなケースはいくらでもありそうですね。

また、前回ちょっと書いたように、初心者、初級者さんたちに処理の詳細を見せずに色々やらせることができるってもの、結構使い道がありそうですよね。

ただ、無理してDecoratorにする必要が無い箇所でもやりかねない監事も受けましたので、そこはケースバイケースで適切に対応できるよう、今後も色々やってみることにします。

 

次回はFactoryパターンをやるつもりですが、その前にこれまでC#でしかコードを書いていなかったので、今までのやつを一回VBに直そうかと思ってます。

#C#読める人はVBも読める人が多いですが、逆は若干少なくなるようですので。

投稿日時 : 2007年6月18日 0:09

Feedback

# re: デザインパターンを学ぶ~その8:Decoratorパターン(3)~ 2007/06/18 14:23 まさる

ん?今更だけど、これってPipeじゃないんでは?
Pipeってある処理の結果を食わせて違う結果を出すってやつですよね?

もっかい考えて再提出します<(_ _)>

# デザインパターンを学ぶ~その11:ちょっとだけDecoratorパターン(1)~ 2007/08/17 14:29 まさるblog

デザインパターンを学ぶ~その11:ちょっとだけDecoratorパターン(1)~

タイトル
名前
Url
コメント