×

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

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

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

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




■IMediator.cs
using System;

namespace Gushwell.DesignPatterns {
    // 調停者、仲裁者
    public interface IMediator {
        void CreateColleagues();
        void ColleagueChanged();
    }
}


■LoginForm.cs
using System;
using System.Windows.Forms;

// .NET Framework にはイベントという機能があるので、このようなWindowsFormsアプリで
// Mediatoprパターンを使うことはないかと思います。
namespace Gushwell.DesignPatterns {
    public partial class LoginForm : Form, IMediator {
        public LoginForm() {
            InitializeComponent();
            CreateColleagues();
            ColleagueChanged();
        }

        // 名前が実態と一致しなくなったが、オリジナルの名前のままとする。
        public virtual void CreateColleagues() {
            // 当Formが、それぞれのコントロールの仲裁者になる
            checkGuest.SetMediator(this);
            checkLogin.SetMediator(this);
            textUser.SetMediator(this);
            textPass.SetMediator(this);
            buttonOk.SetMediator(this);
            buttonCancel.SetMediator(this);
        }

        // Colleage(仲間)からの通知で各Colleageの有効/無効を判定する。
        public virtual void ColleagueChanged() {
            if (checkGuest.Checked) {
                // Guest mode
                textUser.SetColleagueEnabled(false);
                textPass.SetColleagueEnabled(false);
                buttonOk.SetColleagueEnabled(true);
            } else {
                // Login mode
                textUser.SetColleagueEnabled(true);
                UserPassChanged();
            }
        }

        // textUserまたはtextPassの変更があった。
        // 各Colleage(仲間)の有効/無効を判定する。
        private void UserPassChanged() {
            if (textUser.Text.Length > 0) {
                textPass.SetColleagueEnabled(true);
                if (textPass.Text.Length > 0) {
                    buttonOk.SetColleagueEnabled(true);
                } else {
                    buttonOk.SetColleagueEnabled(false);
                }
            } else {
                textPass.SetColleagueEnabled(false);
                buttonOk.SetColleagueEnabled(false);
            }
        }

        private void buttonOk_Click(object sender, EventArgs e) {
            Console.WriteLine(sender + " : " + e.ToString());
            Close();
        }
    }
}



■IColleague.cs
using System;

namespace Gushwell.DesignPatterns {
    // 同僚、仲間
    public interface IColleague {
        void SetMediator(IMediator mediator);
        void SetColleagueEnabled(bool enabled);
    }
}


■ColleagueButton.cs
using System;

namespace Gushwell.DesignPatterns {

    [Serializable]
    public class ColleagueButton : System.Windows.Forms.Button, IColleague {
        private IMediator mediator;
        public ColleagueButton()
            : base() {
        }
        // Mediatorを保持
        virtual public void SetMediator(IMediator value) {
            this.mediator = value;
        }

        // Mediatorから有効/無効が指示される
        virtual public void SetColleagueEnabled(bool value) {
            Enabled = value;
        }
    }
}


■ColleagueRadioButton.cs
using System;

namespace Gushwell.DesignPatterns {

    [Serializable]
    public class ColleagueRadioButton : System.Windows.Forms.RadioButton, IColleague {
        private IMediator mediator = null;
        public ColleagueRadioButton()
            : base() {
        }

        // Mediatorを保持
        virtual public void SetMediator(IMediator value) {
            this.mediator = value;
        }

        // Mediatorから有効/無効が指示される
        virtual public void SetColleagueEnabled(bool value) {
            Enabled = value;
        }

        protected override void OnCheckedChanged(EventArgs e) {
            base.OnCheckedChanged(e);
            if (mediator != null)
                mediator.ColleagueChanged();
        }
    }
}


■ColleagueTextField.cs
using System;

namespace Gushwell.DesignPatterns {

    [Serializable]
    public class ColleagueTextField : System.Windows.Forms.TextBox, IColleague {
        private IMediator mediator = null;
        public ColleagueTextField()
            : base() {
        }

        // Mediatorを保持
        virtual public void SetMediator(IMediator value) {
            this.mediator = value;
        }

        // Mediatorから有効/無効が指示される
        virtual public void SetColleagueEnabled(bool value) {
            Enabled = value;
        }

        // 文字列が変化したらMediatorに通知
        protected override void OnTextChanged(EventArgs e) {
            base.OnTextChanged(e);
            if (mediator != null)
                mediator.ColleagueChanged();
        }
    }
}

■Program.cs
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Gushwell.DesignPatterns {
    static class Program {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new LoginForm());
        }
    }
}