×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

C#デザインパターン  - Facade

ここに掲載したコードは、『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』に掲載されているサンプルコードをC#に移植したものです。
解説らしい解説は載せていませんので、『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』も合わせてお読みください。

※当ソースは、Visual C# 2008 Express Editionで動作を確認しています。
  Visual Studio 2005をお使いの方は、ブログの記事を残しておきますので、そちらをご覧ください。



■Database.cs
using System;
using System.IO;
using System.Collections.Specialized;

namespace Gushwell.DesignPatterns.Facade {

    public static class Database {
        // データベース名からPropertiesを得る
        public static NameValueCollection GetProperties(string dbname) {
            string filename = dbname + ".txt";
            NameValueCollection prop = new NameValueCollection();
            try {
                using (StreamReader sr = new StreamReader(filename)) {
                    while (!sr.EndOfStream) {
                        string line = sr.ReadLine();
                        string[] strs = line.Split('=');
                        prop.Add(strs[0], strs[1]);
                    }
                }
            } catch (System.IO.FileNotFoundException) {
                Console.WriteLine("Warning: " + filename + " is not found.");
            }
            return prop;
        }
    }
}



■HtmlWriter.cs
using System;
using System.IO;

namespace Gushwell.DesignPatterns.Facade {

    public class HtmlWriter {
        private StreamWriter writer;

        // コンストラクタ
        public HtmlWriter(StreamWriter writer) {
            this.writer = writer;
        }

        // タイトルの出力
        public virtual void Title(string title) {
            writer.Write("<html>");
            writer.Write("<head>");
            writer.Write("<title>" + title + "</title>");
            writer.Write("</head>");
            writer.Write("<body>\n");
            writer.Write("<h1>" + title + "</h1>\n");
        }

        // 段落の出力
        public virtual void Paragraph(string msg) {
            writer.Write("<p>" + msg + "</p>\n");
        }

        // リンクの出力
        public virtual void Link(string href, string caption) {
            Paragraph("<a href=\"" + href + "\">" + caption + "</a>");
        }

        // メールアドレスの出力
        public virtual void Mailto(string mailaddr, string userName) {
            Link("mailto:" + mailaddr, userName);
        }

        // 閉じる
        public virtual void Close() {
            writer.Write("</body>");
            writer.Write("</html>\n");
            writer.Close();
        }
    }
}




■PageMaker.cs
using System;
using System.Text;
using System.IO;
using System.Collections.Specialized;

namespace Gushwell.DesignPatterns.Facade {

    public static class PageMaker {
        public static void MakeWelcomePage(string mailAddr, string fileName) {
            try {
                NameValueCollection mailprop = Database.GetProperties("maildata");
                string userName = mailprop.Get(mailAddr);
                HtmlWriter writer =
                    new HtmlWriter(new StreamWriter(fileName, false, Encoding.Default));
                writer.Title("Welcome to " + userName + "'s page!");
                writer.Paragraph(userName + "のページへようこそ。");
                writer.Paragraph("メールまっていますね。");
                writer.Mailto(mailAddr, userName);
                writer.Close();
                Console.WriteLine(fileName + " is created for " + mailAddr +
                                    " (" + userName + ")");
            } catch (System.IO.IOException e) {
                Console.Error.WriteLine(e.StackTrace);
            }
        }
    }
}





■Program.cs
using System;
using Gushwell.DesignPatterns.Facade;

namespace Gushwell.DesignPatterns {

    public static class Program {
        public static void Main(string[] args) {
            PageMaker.MakeWelcomePage("hyuki@hyuki.com", "welcome.html");
        }
    }
}



■Maildata.txt
hyuki@hyuki.com=Hiroshi Yuki
hanako@hyuki.com=Hanako Sato
tomura@hyuki.com=Tomura
mamoru@hyuki.com=Mamoru Takahashi