2011-07-04 5 views
0

プログラムの編集モードについてのアイデアを受け取りたいと思います。つまり、イメージエディタのモードのように、選択されたモードで定義された異なる動作を持つアプリケーションを作成するパターンです。 例を挙げてみましょう:ブロックを配置して矢印でリンクするアプリケーションがあります。だからモード移動ブロック、モード削除ブロック、矢印を使うことができます。ブロック間のリンクの作成やブロックの編集を選択できます。だから私の考えは、私がツールバーのボタンを選択するために必要なそれぞれのタイプの動作です。いずれかのボタンをクリックすると、マウス入力の動作が必要なものに応じて処理されます。エディションモードのデザインパターン

+1

工場パターンを使用するケースはありますか? –

+0

つまり、 'vim'でモード動作をエミュレートしようとしていますか? – GWW

+2

私は、GOFの本はあなたに大きな助けになると思います:http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612 州/戦略パターンに潜入して教えてくださいそれはどうやって行くの? いくつかの興味深いリソース: http://www.dofactory.com/Patterns/PatternStrategy.aspx http://www.dofactory.com/Patterns/PatternState.aspx – nick2083

答えて

0

投稿した例について説明します(ありがとう)。私が何かを逃している場合は教えてください。

すべてのツールが遵守しなければならない共通プロトコルを提供するabstract class Toolをモデル化します。これは、ツールを使用する行為をモデリングするためのメッセージで、それを解放する行為をモデリングするためのメッセージです(鉛筆を使用したとき、表面上に置いて使用して再び持ち上げるときのように)。 RestOnRaiseUpのようなものです。

あなたはツール(どちらかBlock秒またはLink s)は下Element秒で動作し、あなたはウィッヒ要素は、ツールのポインタの下にある知っているクラスにさせるの責任を割り当てる必要があります。それはCanvasクラスかもしれません。

次に、ToolHand Tool,など)から継承ツリーを作成する特定のツール動作を実装できます。 各ツール(シングルトンパターン)の一意のインスタンスを提供Toolクラスの静的メソッド/プロパティを定義します:

abstract class Tool { 
    abstract void RestOn... 
    abstract void RaiseUp... 

    static Tool HandTool() { return _handTool; } 
    static Tool EraseTool() { return _eraseTool; } 
    .... 
} 

その後に私は次のことを行うと、ツールバーのボタンとの統合のために

ツールバーのボタンのハンドラは、各ツールは抽象クラスToolに関してpolimorphycallyであるという事実は、あなたが忘れようになる

btnHandTool_click(...) { 
    _canvas.SetActiveTool(Tool.HandTool()); 
} 

btnEraseTool_click(...) { 
    _canvas.SetActiveTool(Tool.EraseTool()); 
} 
... 

のようなものがあるでしょうアクティブなツールがHandToolかEraseToolのインスタンスかどうかを特定するコードを書いてください。 canvaのアクティブなツールの戦略(パターン)を変更することができます。内部的には、クラスは、実行中のツールが使用されていることを伝えることができません。それは、それが応答できるメッセージについてのみ知っています。

最後が、非常に重要なのは、あなたがそれを描画アプリケーションを構築するために専用の章では、さまざまなを示す、ツールのセット設計オブジェクト指向ソフトウェアという名前レベッカ・ウィフズ・ブロックによってexelent本の中で見つけることができますモデリングに使用できるテクニック 私はそれをつかみ、見てみることをお勧めします。本当に価値があります。

0

状態パターンは、この種の作業には理想的です。

関連する問題