1

Photoshopなどのツールには、クリックできるツールの選択肢があります(ペン、ブラシなど)。ツールをクリックすると、選択したツールに応じて、そのツールを使用してペイント、消去などを行うことができます。

それがオブジェクト指向デザインにどのように最適に実装されるのだろうかと思います。どのツールが選択されているかを常に認識しているGUIManagerがあるとしか考えられませんでした。次に、Canvas(描画領域)がマウスクリックまたはマウスドラッグを検出すると、GUIManagerにどのツールが選択されているかを尋ね、そのツールの動作を適用します。

考えられる解決策をクラスレベルの詳細(または時間がない場合は詳細)で説明している人はいますか?

4

3 に答える 3

1

まさにあなたの例を持っている状態パターンを見てください。

ただし、これは実際にはGUIの質問ではなく、この問題をモデル化する方法に対するオブジェクト指向のアプローチです。GUIは実際にはこれに関与していません。

于 2009-11-27T07:16:25.577 に答える
1

すべてのグラフィック要素がおそらく選択した GUI の共通の基本クラスから派生しているという意味を除いて、OO の原則が実際にこれに影響を与えるかどうかはわかりません。

Photoshop のようなスクリーン メニューの階層を必要とするアプリケーションの複雑さの量は、おそらく、構成、継承、機能的スタイル、および任意のものの違いを小さくするでしょう。

ただし、異なるスタイルを使用してプログラムを 2 回作成する動機があれば、結果を見るのは興味深いかもしれません。さまざまなプログラミング スタイルのランキングは、まだ完全に定量化されていない点で OO スタイルが重要であると考えていますが、現時点では本当の答えのない未解決の問題です。

于 2009-11-27T07:25:14.937 に答える
1

これに対する 1 つのアイデアは、ツール クラスを持つことです。これを C++ のような疑似コードでスケッチするだけです。

class Tool
{
public:
    // Keep a pointer to the "document", i.e. some representation of the
    // image you are editing
    Tool(Document *pDoc);

    // Process mouse events -- this need to be overridden to execute
    // the appropriate behaviour depending on the concrete type of tool
    virtual void OnMouseEvent(const MouseEvent &e) = 0;

    // and so on
};

次に、この抽象ツール クラスを継承して、アプリケーションが必要とする具体的なツールを提供します。特定のツールを選択すると、対応するツール オブジェクトがインスタンス化され、どこかに記憶されます。ウィンドウはマウス イベントを現在アクティブなツール オブジェクトに転送し、選択されたツールに対して適切な処理を実行します。

これは、Johannes が参照している State パターンの実装です。

于 2009-11-27T07:29:13.790 に答える