×

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

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

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

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



IPrintable.cs
using System;

namespace Gushwell.DesignPatterns {
    public interface IPrintable {
        string PrinterName { get; set; }
        void Print(string string_Renamed);  // 文字列表示(プリントアウト)
    }
}


■Printer.cs
using System;

namespace Gushwell.DesignPatterns {
    public class Printer : IPrintable {
        // コンストラクタ
        public Printer() {
            HeavyJob("Printerのインスタンスを生成中");
        }

        // コンストラクタ
        public Printer(string name) {
            this.PrinterName = name;
            HeavyJob("Printerのインスタンス(" + name + ")を生成中");
        }

        public string PrinterName { get; set; }      


        // 名前付きで表示
        public virtual void Print(string string_Renamed) {
            Console.WriteLine("=== " + PrinterName + " ===");
            Console.WriteLine(string_Renamed);
        }

        // 重い作業(のつもり)
        private void HeavyJob(string msg) {
            Console.Write(msg);
            for (int i = 0; i < 5; i++) {
                System.Threading.Thread.Sleep(1000);
                Console.Write(".");
            }
            Console.WriteLine("完了。");
        }
    }
}



■PrinterProxy.cs
using System;

namespace Gushwell.DesignPatterns {
    public class PrinterProxy : IPrintable {
        private string name;  // 名前
        private Printer real; // 「本人」

        public PrinterProxy() {
        }

        // コンストラクタ
        public PrinterProxy(string name) {
            this.name = name;
        }

        // 名前の取得、名前の設定
        public string PrinterName { 
            get {
                return name;
            }
            set {
                lock (this) {
                    if (real != null) {
                        real.PrinterName = value; // 「本人」にも設定する
                    }
                    this.name = value;
                }
            }
        }

        // 表示
        public virtual void Print(string string_Renamed) {
            Realize();
            real.Print(string_Renamed);
        }

        // 「本人」を生成
        private void Realize() {
            lock (this) {
                if (real == null) {
                    real = new Printer(name);
                }
            }
        }
    }
}






■Program.cs
using System;

namespace Gushwell.DesignPatterns {
    public class Program {

        [STAThread]
        public static void Main(string[] args) {
            IPrintable p = new PrinterProxy("Alice");
            Console.WriteLine("名前は現在" + p.PrinterName + "です。");
            p.PrinterName = "Bob";
            Console.WriteLine("名前は現在" + p.PrinterName + "です。");
            p.Print("Hello, world.");
        }
    }
}