もう1つの選択肢は、コンポジションデザインパターンですが、「デコレータパターン」のように変更されています。
次の例は、描画動作にのみ適用され、マウスやキーボードの動作には適用されません。次のグラフのドットは無視してください。
注:C ++やC#に似ているため、Objective-cとのわずかな違いは無視してください。
まず、メンバーまたはアイテムに「描画」機能を「委任」するボタンクラスが必要です。まず、メインクラスだけを見てみましょう。
................................................................................
..+--------------------------------+..../|..+--------------------------------+..
..| GraphicObjectClass |.../.|..| CompositeButtonClass |..
..+--------------------------------*--<..|--*--------------------------------+..
..| [+] void Draw(); <<virtual>> |...\.|..| [+] void Draw(); <<override>> |..
..+--------------------------------+....\|..+--------------------------------+..
................................................................................
ボタンが必要だとしましょう。
- 境界線を引く「モジュールクラス」
- 背景、単色、またはパターンを描画する「モジュールクラス」
- テキストラベル、太字、斜体、フォント名を描画する「モジュールクラス」
2番目のグラフは、それを個別に実行する個別の「モジュール」またはクラスを示しています。
................................................................................
..+--------------------------------+............................................
..| GraphicObjectClass |............................................
..+--------------------------------+............................................
..| [+] void Draw(); <<virtual>> |............................................
..+---------------*----------------+............................................
..................|.............................................................
..................^.............................................................
................./.\............................................................
................/...\...........................................................
.............../--+--\..........................................................
..................|.............................................................
..+---------------*----------------+.../|...+--------------------------------+..
..| ButtonComponentClass |../.|...| SolidColorButtonClass |..
..+--------------------------------+-<..|-*.+--------------------------------+..
..| [+] void Draw(); <<virtual>> |..\.|.|.| [+] void Draw(); <<override>> |..
..+--------------------------------+...\|.|.+--------------------------------+..
..........................................|.....................................
..........................................|.+--------------------------------+..
..........................................|.| LabeledButtonClass |..
..........................................|.+--------------------------------+..
..........................................*-* [+] void Draw(); <<override>> |..
..........................................|.+--------------------------------+..
..........................................|.....................................
..........................................|.+--------------------------------+..
..........................................|.| BorderButtonClass |..
..........................................|.+--------------------------------+..
..........................................*-* [+] void Draw(); <<override>> |..
............................................+--------------------------------+..
................................................................................
コンポーネントをボタンに統合しましょう。継承の関連付けについて、他の関連付けとは異なるチャートを作成していることに注意してください。
.......................................................................................
.+--------------------------------------------+.....+--------------------------------+.
.| CompositeButtonClass |.....| SolidColorButtonClass |.
.+--------------------------------------------+.....+--------------------------------+.
.| [+] ButtonComponentClass* Background *-----* [+] void Draw(); <<override>> |.
.| |.....+--------------------------------+.
.| [+] ButtonComponentClass* Border *---*....................................
.| |...|.+--------------------------------+.
.| [+] ButtonComponentClass* Label *-*.|.| LabeledButtonClass |.
.+--------------------------------------------+.|.|.+--------------------------------+.
.| [+] void Draw(); <<virtual>> |.|.+-* [+] void Draw(); <<override>> |.
.+--------------------------------------------+.|...+--------------------------------+.
................................................|......................................
................................................|...+--------------------------------+.
................................................|...| BorderButtonClass |.
................................................|...+--------------------------------+.
................................................*---* [+] void Draw(); <<override>> |.
....................................................+--------------------------------+.
.......................................................................................
これで、メンバーまたはアイテムに「描画」機能を「委任」するボタンクラスができました。まず、メインクラスだけを見てみましょう。
virtual /* override */ void CompositeButtonClass::Draw()
{
// [Background Draw]
this->Background->Draw();
// [Border Draw]
this->Border->Draw();
// [Label Draw]
this->Label->Draw();
}
ただの提案。
乾杯。