2006年03月14日

Facade −シンプルな窓口

  
ここに掲載したコードは、『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』に掲載されているサンプルコードをC#に移植したものです。移植後のコードの公開に関しては、結城氏の了解を得ています。
※当ソースは、Visual C# 2005 Express Editionで動作を確認しています。



HtmlWriterクラス
using System;
using System.IO;

namespace Gushwell.DesignPatterns.Pagemaker {

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



Databaseクラス
using System;
using System.IO;
using System.Collections.Specialized;

namespace Gushwell.DesignPatterns.Pagemaker {

public class Database {
private Database() {
// newでインスタンス生成させないためにprivate宣言
}

// データベース名からPropertiesを得る
public static NameValueCollection GetProperties(string dbname) {
string filename = dbname + ".txt";
NameValueCollection prop = new NameValueCollection();
try {
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;
}
}
}



PageMakerクラス
using System;
using System.Text;
using System.IO;
using System.Collections.Specialized;

namespace Gushwell.DesignPatterns.Pagemaker {

public class PageMaker {
private PageMaker() {
// インスタンスは作らないのでprivate宣言する
}

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クラス
using System;
using Gushwell.DesignPatterns.Pagemaker;

namespace Gushwell.DesignPatterns {

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



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/50381758