Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_0Number_7Number_5Number_1Number_2Number_2Number_4
インデント OCPとデザインパターン
インデント サンプルコードについて
インデント デザインパターン ひとくちメモ
インデント FactoryMethodパターン
インデント AbstractFactoryパターン
インデント Builderパターン
インデント Prototypeパターン
インデント Adapterパターン
インデント Bridgeパターン
インデント Compositeパターン
インデント Decoratorパターン
インデント Facadeパターン
インデント Flyweightパターン
インデント Proxyパターン
インデント TemplateMethodパターン
インデント Chain of Responsibilityパターン
インデント Commandパターン
インデント Iteratorパターン
インデント Mediatorパターン
インデント Mementoパターン
インデント Observerパターン
インデント Stateパターン
インデント Strategyパターン
インデント Visitorパターン
インデント 速習!デザインパターン第一回
インデント 速習!デザインパターン第二回
インデント 速習!デザインパターン第三回
インデント UMLとは
インデント UML入門
インデント オブジェクト指向
インデント クラス図
インデント アクティビティ図
インデント インタラクション図
インデント ユースケース図
インデント Rarestyle証明書サービス
インデント QRコード発行WSDL
インデント QRコード発行サンプル
インデント J2EE覚書
インデント FreeMind実践レポート
インデント モバイル情報
インデント Homeページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

Mediatorパターン (デザインパターン)

Mediatorパターン 導入

Mediatorパターンは複数の関連し合うオブジェクト群に「仲介役」をおいて協調させるパターンです。

関連し合う複数のオブジェクトをメンバとします。メンバは仲介者役のオブジェクトを置いて協調動作を任せます。 メンバーについてはColleage(同僚)という枠で抽象化します。また抽象化したメンバーについて仲介者を保持できる こと、具象メンバーに対して仲介者が操作できるように共通のインターフェースも定義して、具象仲介者では再定義します。

Mediatorパターン ポイント

メンバー同士が、仲介者に状況を伝えることで、メンバ同士のやり取りをなくすことで処理系統の単純化、再利用の しやすさが生じます。

UML Mediatorパターン

C#ソースコード Mediatorパターン

Sample.cs

using System;
using System.Collections;
namespace Mediator
{
   //--------------------------------------------------
   //  デザインパターン Mediator
   //
   //  複数の関連しあうオブジェクト群に対して、「仲介役」
   //  をおいて強調させる
   //
   //  各メンバーはそれぞれMeditorに報告します
   // 各メンバーは自分以外のことを知りません。
   //  Meditorはそれぞれのメンバーの状況を総合的に判断して
   //  指示を出します。
   //--------------------------------------------------

   //Mediatorの抽象定義
   public abstract class Mediator
   {
       public abstract void SendMessage(Colleague colle);
   }

   //具象Mediator(調停者)
   public class ConcreteMediator :Mediator
   {
       private ArrayList aryColleague=new ArrayList();

       public void AddConcreteColleague(Colleague colle)
       {
           aryColleague.Add(colle);
       }

       public override void SendMessage(Colleague colle)
       {
           string strLike= colle.LikeType;

           switch (strLike)
           {
               case "sexy":
                   ((Colleague)colle).Notify("クラブ、ディスコ");
                   break;
               case "fat":
                   ((Colleague)colle).Notify("ファーストフード屋さん");
                   break;
               case "funny" :
                   ((Colleague)colle).Notify("なんばの引っ掛け橋");
                   break;
               default :
                   ((Colleague)colle).Notify("OMMG");
                   break;
           }

           string strWithFriends =WithFriends(colle);

           if(strWithFriends!="")
           {
               Console.WriteLine("{0}さんも一緒に",strWithFriends);
           }
       }

       //ヘルパーメソッド
       //Mediator(調停者)は相談したものの中から、
       //好きなタイプ同士を選び出します。
       private string WithFriends(Colleague MySelfcolle)
       {
           string strWithFriends="";

           foreach(Colleague colle in aryColleague)
           {
               if (!MySelfcolle.Equals(colle))
               {
                   if(MySelfcolle.LikeType==colle.LikeType)
                   {
                       strWithFriends +=colle.ColleagueName + ",";
                   }
               }
           }
           return strWithFriends;
       }
   }

   //同僚の抽象定義
   public abstract class Colleague
   {
       protected Mediator Med;

       //コンストラクタ
       //調停者を参照できるように
       public Colleague(Mediator Med)
       {
           this.Med=Med;
       }

       //同僚の名前(同僚共通の要素)
       public abstract string ColleagueName
       {
           get;
           set;
       }

       //好きな女性のタイプを持つ(同僚共通の要素)
       public abstract string LikeType
       {
           set;
           get;
       }

       //基底クラスから派生クラスのメソッドを実行できるようにする
       public abstract void Notify(string strReturnMessage);
   }

   //同僚の具象定義
   public class ConcreteColleague : Colleague
   {
       private string strLikeType;
       private string strColleagueName;

       public ConcreteColleague(Mediator med,string strColleagueName):base(med)
       {
           this.strColleagueName=strColleagueName;
       }

       //名前を実装
       public override string ColleagueName
       {
           set{this.strColleagueName=value;}
           get{return this.strColleagueName;}
       }

       //好みのタイプを実装
       public override string LikeType
       {
           set{this.strLikeType=value;}
           get{return this.strLikeType;}
       }

       //Mediatorに相談
       public void SendMessage()
       {
           this.Med.SendMessage(this);
       }

       //Meditorに相談した結果を反映させるメソッド
       public override void Notify(string strReturnMessage)
       {
           Console.WriteLine("Meditorに相談した結果、私は{0}でみつけます。",strReturnMessage);
       }
   }


   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {
           //調停者登場
           ConcreteMediator namihei =new ConcreteMediator();

           //同僚(tom登場 namiheiに相談者を持つ)
           ConcreteColleague tom =new ConcreteColleague(namihei,"トム");
           //彼の好みはSexyです
           tom.LikeType="sexy";

           //同僚(mike登場 namiheiに相談者を持つ)
           ConcreteColleague mike =new ConcreteColleague(namihei,"マイク");
           //彼の好みはfatです
           mike.LikeType="fat";

           ConcreteColleague ken =new ConcreteColleague(namihei,"ケン");
           //彼の好みはfunnyです
           ken.LikeType="funny";

           //同僚(beg登場 namiheiに相談者を持つ)
           ConcreteColleague beg =new ConcreteColleague(namihei,"ベグ");
           beg.LikeType="cool";

           //同僚(joge登場 namiheiに相談者を持つ)
           ConcreteColleague joge =new ConcreteColleague(namihei,"ジョジ");
           //彼の好みはSexyです
           joge.LikeType="sexy";

           //同僚たちは、調停者に相談します。
           namihei.AddConcreteColleague(tom);
           namihei.AddConcreteColleague(mike);
           namihei.AddConcreteColleague(ken);
           namihei.AddConcreteColleague(beg);
           namihei.AddConcreteColleague(joge);

           //調停者が指示したとおりに実行しました
           tom.SendMessage();
           mike.SendMessage();
       }
   }
}

Mediator 実行結果

Iterator_fig

UMLプラグインによる描画 Mediatorパターン

Javaソースコード Mediatorパターン

Mediator.java
   1: package mediator;
   2: 
   3: public abstract class Mediator {
   4: 
   5:     public abstract void sendMessage(Colleague colleague, String strMessage);
   6: 
   7: }
ConcreteMediator.java
   1: package mediator;
   2: 
   3: public class ConcreteMediator extends Mediator {
   4: 
   5:     private ConcreteColleague_Younger concreteColleague_Younger;
   6: 
   7:     private ConcreteColleague_Gentle concreteColleague_Gentle;
   8: 
   9:     private Concrete_Older concrete_Older;
  10: 
  11:     public ConcreteColleague_Younger getConcreteColleague_Younger() {
  12:         return concreteColleague_Younger;
  13:     }
  14: 
  15:     public void setConcreteColleague_Younger(ConcreteColleague_Younger concreteColleague_Younger) {
  16:         this.concreteColleague_Younger = concreteColleague_Younger;
  17:     }
  18: 
  19:     public ConcreteColleague_Gentle getConcreteColleague_Gentle() {
  20:         return concreteColleague_Gentle;
  21:     }
  22: 
  23:     public void setConcreteColleague_Gentle(ConcreteColleague_Gentle concreteColleague_Gentle) {
  24:         this.concreteColleague_Gentle = concreteColleague_Gentle;
  25:     }
  26: 
  27:     public Concrete_Older getConcrete_Older() {
  28:         return concrete_Older;
  29:     }
  30: 
  31:     public void setConcrete_Older(Concrete_Older concrete_Older) {
  32:         this.concrete_Older = concrete_Older;
  33:     }
  34: 
  35:     //調停者はColleage別に指示を出します。
  36:     public void sendMessage(Colleague colleague, String strMessage) {
  37:         
  38:         //調停者の指示を記述
  39:         System.out.println(strMessage+"と呼びかけられたら、調停者はこのように返答させます。");
  40:         
  41:         if(colleague ==this.concreteColleague_Younger)
  42:         {
  43:             this.concreteColleague_Younger.notify("おっはー!");
  44:                     
  45:         }else if(colleague==this.concreteColleague_Gentle){
  46:             
  47:             this.concreteColleague_Gentle.notify("おはようございます。");
  48:             
  49:         }else if(colleague==this.concrete_Older){
  50:             
  51:             this.concrete_Older.notify("おまえさんの朝は、今ごろかい?");
  52:         }
  53:     }
  54: 
  55: }
Colleague.java
   1: package mediator;
   2: 
   3: public abstract class Colleague {
   4: 
   5:     private Mediator mediator;
   6:     
   7:     public Mediator getMediator() {
   8:         return mediator;
   9:     }
  10: 
  11:     public void setMediator(Mediator mediator) {
  12:         this.mediator = mediator;
  13:     }
  14: 
  15:     public abstract void notify(String strMessage);
  16: }
ConcreteColleague_Younger.java
   1: package mediator;
   2: 
   3: public class ConcreteColleague_Younger extends Colleague {
   4: 
   5:     //調停者からの指示を実行します。
   6:     public void notify(String strMessage) {
   7:         System.out.println(strMessage);
   8:     }
   9: 
  10:     public void send(String strSendMessage) {
  11:         this.getMediator().sendMessage(this,strSendMessage);
  12:     }
  13: 
  14: }
ConcreteColleague_Gentle.java
   1: package mediator;
   2: 
   3: public class ConcreteColleague_Gentle extends Colleague {
   4:     //調停者からの指示を実行します。
   5:     public void notify(String strMessage) {
   6:           System.out.println(strMessage);
   7:       }
   8:     public void send(String strSendMessage) {
   9:         this.getMediator().sendMessage(this,strSendMessage);
  10:     }
  11: }
Concrete_Older.java
   1: package mediator;
   2: 
   3: public class Concrete_Older extends Colleague {
   4:     
   5:     //調停者からの指示を実行します。
   6:     public void notify(String strMessage) {
   7:         System.out.println(strMessage);
   8:     }
   9: 
  10:     public void send(String strSendMessage) {
  11:         this.getMediator().sendMessage(this,strSendMessage);
  12:     }
  13: 
  14: }
StartClass.java
   1: package mediator;
   2: 
   3: public class StartClass {
   4: 
   5:     public static void main(String[] args) {
   6:         //調停者のインスタンス
   7:         ConcreteMediator mediator =new ConcreteMediator();
   8:         //同僚クラス
   9:         ConcreteColleague_Younger     younger     =new ConcreteColleague_Younger();
  10:         ConcreteColleague_Gentle     gentle        =new ConcreteColleague_Gentle();
  11:         Concrete_Older                older        =new Concrete_Older();
  12:         
  13:         //同僚の調停者をセットします。
  14:         younger.setMediator(mediator);
  15:         gentle.setMediator(mediator);
  16:         older.setMediator(mediator);
  17:         
  18:         //調停者に同僚を加えます。
  19:         mediator.setConcreteColleague_Younger(younger);
  20:         mediator.setConcreteColleague_Gentle(gentle);
  21:         mediator.setConcrete_Older(older);
  22:         
  23:         //調停者からの指示を実行させます。
  24:         mediator.sendMessage(younger,"おはよう!");
  25:         mediator.sendMessage(gentle,"おはよう!");
  26:         mediator.sendMessage(older,"おはよう!");
  27:     }
  28: }



コミュニティマーカーデザインパターン「ひとくちメモ」へ

コミュニティマーカーHomeへもどる

お天気情報
東京都 東京 - 今日の天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
東京都 東京 - 明日の天気
晴時々曇 - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2010/09/03 17:00:00  ST: True
東京都 東京 - あさっての天気
曇時々晴 - リンク先
最高 最低
気温 34 27
湿度 93.2 80.6
取得日:2010/09/03 17:00:00  ST: True
大阪府 大阪 - 今日の天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
大阪府 大阪 - 明日の天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
大阪府 大阪 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 36 28
湿度 96.8 82.4
取得日:2010/09/03 17:00:00  ST: True
livedoorのWebサービスより提供
【工事中】お天気配信 ユーザー登録
Copyright 2006 Rarestyle このページへのリンクは確認不要です。
Programming by Xenon Project Team     postmaster@rarestyle.net
免責事項について
レアスタイルサイト内検索