すらすらプログラマーへのお問い合わせ
すらすらのブログ
アクセス数  累計:000,683,158  昨日:000,000,166  本日:000,000,185
Loading
やってみよう!
.NET プログラミング
プロパティグリッド
印刷
リストボックス
スレッド
リストビュー
インストーラー
やってみよう!

できるVisual Studio 2015 Windows /Android/iOS アプリ対応

独習C# 第3版

VisualBasic2013パーフェクトマスター (Perfect Master SERIES)

プログラミング.NET Framework 第4版 (Microsoft Press)

VisualBasic2013逆引き大全555の極意

猫でもわかるWindowsプログラミング 第4版 (猫でもわかるプログラミング)

VisualC#2013逆引き大全555の極意

ラジアルパターン 最終更新:2010/12/05
【Amazon ランキング:ゲーム - プレイステーション4】

プログラミングをやっているとよくMVCモデルという言葉を耳にしますが、実際にMVCモデルに合わせてプログラミングしようとするといろいろ障害にぶつかってしまいます。
そこで私は Radialパターンというデザインパターンを作ってみました。Brigeパターンをベースに中央に Hubをおいてそれを取り囲むようにオブジェクトを配置します。それぞれのオブジェクトへはHubを介してアクセスをできる経路を確保しているためMVCに分割してもプログラミングの自由度を損ないません。
ラジアルパターン
ここではRadialパターンのサンプルプログラムを作成してその概念を説明します。
フォームの作成
Form1 を作成して次のようにコントロールを配置します。

Label:[Label1]
TextBox:[textBox1]
Button:[button1]
Text 表示
まずは表示を担当する ViewBalloonClass を作成します。実際に処理を行うコードはフォームに記述するので ViewBalloonClass にはメソッドを呼び出すデリゲーターのみを定義します。
※クラス名についている "Balloon" は Hub に結びついているオブジェクトのイメージ図が風船みたいだからです。
C#[ViewBalloonClass.cs]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Radial
{
    
/// <summary>
    /// 表示を担当するバルーンクラスです。
    /// </summary>
    public class ViewBalloonClass
    {
        
/// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="hub"></param>
        public ViewBalloonClass(HubClass hub)
        {
            
this.Hub = hub;
        }

        
/// <summary>
        /// ハブクラス
        /// </summary>
        protected HubClass Hub { getset; }

        
/// <summary>
        /// ラベルに文字列を画面に表示します。
        /// 処理はフォームに実装します。
        /// </summary>
        public Action<string> ShowString { getset; }

        
/// <summary>
        /// テキストボックスの入力文字列を取得します。
        /// 処理はフォームに実装します。
        /// </summary>
        public Func<string> GetInputString{ getset; }
    }
}
イベントを担当するバルーンクラスです。フォーム上のコントロールのイベントハンドルをこのクラスのメソッドに直接結びつけます。
C#[EventBalloonClass.cs]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Radial
{
    
/// <summary>
    /// イベントを担当するバルーンクラスです。
    /// </summary>
    public class EventBalloonClass
    {
        
/// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="hub"></param>
        public EventBalloonClass(HubClass hub)
        {
            
this.Hub = hub;
        }

        
/// <summary>
        /// ハブクラス
        /// </summary>
        protected HubClass Hub { getset; }

        
/// <summary>
        /// 表示ボタンクリックイベントを処理します。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void button1_Click(object sender, EventArgs e)
        {
            
// テキストボックスに入力された文字列を取得します。
            string value = Hub.ViewBalloon.GetInputString();

            
// 文字列をラベルに表示します。
            Hub.ViewBalloon.ShowString(value);

            
// 文字列をファイルに保存します。
            Hub.FileBalloon.SaveFile(value);
        }
    }
}
ファイルアクセスを担当するバルーンクラスです。ディレクトリ監視を行ってファイルが変更されると表示が切り変わります。
C#[FileBalloonClass.cs]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Radial
{
    
/// <summary>
    /// ファイルアクセスを担当するバルーンクラスです。
    /// </summary>
    public class FileBalloonClass
    {
        
protected const string FILE_PATH = @"c:\tmp";
        
protected const string FILE_NAME = "sample.txt";

        
protected FileSystemWatcher _watcher;

        
/// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="hub"></param>
        public FileBalloonClass(HubClass hub)
        {
            
this.Hub = hub;

            
// ファイル監視
            _watcher = new FileSystemWatcher();
            _watcher.Path = FILE_PATH;
            _watcher.NotifyFilter = 
NotifyFilters.LastWrite;
            _watcher.Filter = 
"*.txt";
            _watcher.Changed += 
new FileSystemEventHandler(
                watcher_Changed);
            _watcher.EnableRaisingEvents = 
true;
        }

        
/// <summary>
        /// ハブクラス
        /// </summary>
        protected HubClass Hub { getset; }

        
/// <summary>
        /// 文字列をファイルに保存します。
        /// </summary>
        /// <param name="value"></param>
        public void SaveFile(string value)
        {
            _watcher.EnableRaisingEvents = 
false;

            
using (StreamWriter sw = new StreamWriter(
                
Path.Combine(FILE_PATH, FILE_NAME), false))
            {
                sw.Write(value);
            }

            _watcher.EnableRaisingEvents = 
true;
        }

        
/// <summary>
        /// ファイル変更イベントを処理します。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void watcher_Changed(object sender, FileSystemEventArgs e)
        {
            
try
            {
                
// テキストボックスに入力された文字列を取得します。
                string value = "";
                
using (StreamReader sr = new StreamReader(
                    
Path.Combine(FILE_PATH, FILE_NAME)))
                {
                    value = sr.ReadLine();
                }

                
// 文字列をラベルに表示します。
                Hub.ViewBalloon.ShowString(value);
            }
            
catch (Exception ex)
            {
                System.Diagnostics.
Debug.WriteLine(
                    ex.ToString());
            }
        }        
    }
}
3つのオブジェクトををつなぐ Hub クラスです。このクラスは連携するバルーンクラスで共有します。
C#[HubClass.cs]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Radial
{
    
/// <summary>
    /// ハブクラス
    /// </summary>
    public class HubClass
    {
        
/// <summary>
        /// 表示バールンプロパティ
        /// </summary>
        public ViewBalloonClass ViewBalloon { getset; }

        
/// <summary>
        /// イベントバールンプロパティ
        /// </summary>
        public EventBalloonClass EventBalloon { getset; }

        
/// <summary>
        /// ファイルバールンプロパティ
        /// </summary>
        public FileBalloonClass FileBalloon { getset; }

    }
}
Form クラスです。ViewBalloon と連動するためのメソッドを記述します。
C#[Form1.cs]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Radial
{
    
public partial class Form1 : Form
    {
        
public Form1()
        {
            InitializeComponent();

            
// ハブクラス作成
            HubClass hub = new HubClass();

            
// 表示バルーン
            hub.ViewBalloon = new ViewBalloonClass(hub);
            hub.ViewBalloon.ShowString += 
new Action<string>(
                
this.ShowString);
            hub.ViewBalloon.GetInputString += 
new Func<string>(
                
this.GetInputString);

            
// イベントバルーン
            hub.EventBalloon = new EventBalloonClass(hub);
            
this.button1.Click += new System.EventHandler(
                hub.EventBalloon.button1_Click);

            
// ファイルバルーン
            hub.FileBalloon = new FileBalloonClass(hub);
        }

        
/// <summary>
        /// 文字列をラベルに表示します。
        /// </summary>
        public void ShowString(string value)
        {
            
if (this.label1.InvokeRequired)
            {
                
this.label1.Invoke(new Action<string>(
                    
this.ShowString), value);
                
return;
            }

            
this.label1.Text = value;
        }

        
/// <summary>
        /// テキストボックスに入力された文字列を取得します。
        /// </summary>
        /// <returns></returns>
        public string GetInputString()
        {
            
return this.textBox1.Text;
        }
    }
}
実行
「表示」テキストボックスに入力した内容がラベルに表示されて、sample.txt ファイルに出力されます。また、sample.txt ファイルの内容を変更するとラベルの表示が変わることが確認できると思います。
※このページで紹介しているサンプルコードについて管理者は動作保障をいたしません※
※サンプルコードを使用する場合は、自己責任でお願いします※

【楽天 ランキング:スマートフォン】




このサイトはフリーソフトのMerge HTMLで作成されています。
このサイトはリンクフリーです。

ページの先頭に戻る Copyright© 2010-2015 Jun.Shiozaki All rights reserved.