Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_1Number_3Number_9Number_3Number_0Number_8Number_9
インデント 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ページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

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

Stateパターン 導入

Stateパターンは、状態オブジェクトを利用することで、オブジェクトの状態をによる振る舞いの変化を実現するパターンです。

状態変化に対して何か処理を実行させる時、状態を調べてif文やswitch文などで分岐させて、 それぞれの処理を走らせますか?オブジェクト指向のプログラミングでは、場合分けをするばあい 、なるべくポリモーフィズムをつかって実現するようにします。

Stateパターン ポイント

Context(状況)に状態オブジェクトを保持できるようにします。状態による個々の振る舞いは、 派生クラスで実現します。

UML Stateパターン

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

Sample.cs

using System;

namespace State
{
   //-------------------------------------------------------------
   //  デザインパターン State
   //
   //  状態オブジェクトを利用することで、オブジェクトの振る舞いの変化を
   //  実現する。
   //  対象となるオブジェクトは、その状態を保持し、保持したオブジェクト
   //  に対して、要求を送ることで、状態に応じた振る舞いを実現します。
   //
   //-------------------------------------------------------------
   public abstract class State
   {
       //状態に依存する振る舞いのインタフェースを定義します。
       public abstract void Handle();
   }

   //リッチな時の状態の具象定義
   public class ConcreteState_Rich : State
   {
       public override void Handle()
       {
           Console.WriteLine("焼肉食べにいきましょう!!");
       }
   }

   //プアーな時の状態の具象定義
   public class ConcreteState_Poor :State
   {
       public override void Handle()
       {
           Console.WriteLine("おごってください。しくしく");
       }
   }

   //状況クラスの定義
   public class Context
   {
       //状態を保持するプロパティを定義します。
       private State ObjState;

       public State SetState
       {
           set{this.ObjState=value;}
           get{return this.ObjState;}
       }

       //保持している状態オブジェクトに対して処理を送ります。
       //これもポリフォーフィズムですね。
       public void Request()
       {
           this.SetState.Handle();
       }
   }

   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {
           Context Ctx =new Context();
           //状態定義
           ConcreteState_Rich Rich =new ConcreteState_Rich();
           ConcreteState_Poor Poor =new ConcreteState_Poor();

           //状態を保持させる
           Ctx.SetState = Rich;
           //要求を送ります
           Ctx.Request();

           //状態を差し替える
           Ctx.SetState = Poor;
           //要求を送ります
           Ctx.Request();

           //------補足---------------------------------------------
           //  状態をオブジェクトして扱うことがこのパターンのポイントです
           //  これにより、状態による振る舞いの違いをif文やswitch文でなく
           //  状態オブジェクトのポリモーフィズムで実現します。
           //
           // if文やswitch文を使わないオブジェクト指向のすばらしいところですね。
           //--------------------------------------------------------
       }
   }
}

State 実行結果

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

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

State.java
   1: package state;
   2: 
   3: public abstract class State {
   4: 
   5:     public abstract void Handle();
   6: 
   7: }
Context.java
   1: package state;
   2: 
   3: public class Context {
   4: 
   5:     private State state;
   6: 
   7:     public State getState() {
   8:         return state;
   9:     }
  10: 
  11:     public void setState(State state) {
  12:         this.state = state;
  13:     }
  14: 
  15:     public void request() {
  16:         this.getState().Handle();
  17:     }
  18: 
  19: }
ConcreteState_Rich.java
   1: package state;
   2: 
   3: public class ConcreteState_Rich extends State {
   4: 
   5:     public void Handle() {
   6:         System.out.println("焼肉食べに行きましょう");
   7:     }
   8: }
ConcreteState_Poor.java
   1: package state;
   2: 
   3: public class ConcreteState_Poor extends State {
   4: 
   5:     public void Handle() {
   6:         System.out.println("おごってください!しくしく");
   7:         
   8:     }
   9: 
  10: }
StartClass.java
   1: package state;
   2: 
   3: public class StartClass {
   4: 
   5:     public static void main(String[] args) {
   6:         
   7:         //Contextインスタンス生成
   8:         Context context =new Context();
   9:         
  10:         //状態オブジェクト生成
  11:         ConcreteState_Poor poor =new ConcreteState_Poor();
  12:         ConcreteState_Rich rich =new ConcreteState_Rich();
  13:         
  14:         //状態をセット
  15:         context.setState(poor);
  16:         //要求を送る
  17:         context.request();
  18:         
  19:         //状態をセット
  20:         context.setState(rich);
  21:         //要求を送る
  22:         context.request();
  23:         
  24:     }
  25: }



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

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

お天気情報
東京都 東京 - 今日の天気
曇り - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - 明日の天気
晴のち雨 - リンク先
最高 最低
気温 9 3
湿度 48.2 37.4
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 11 4
湿度 51.8 39.2
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 今日の天気
晴のち曇 - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 明日の天気
- リンク先
最高 最低
気温 11 5
湿度 51.8 41
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - あさっての天気
曇時々晴 - リンク先
最高 最低
気温 7 3
湿度 44.6 37.4
取得日:2012/02/05 17:00:00  ST: True
livedoorのWebサービスより提供
【工事中】お天気配信 ユーザー登録
rarestyle
Copyright 2006 Rarestyle このページへのリンクは確認不要です。
Programming by Xenon Project Team     postmaster@rarestyle.net
免責事項について
レアスタイルサイト内検索