部品を合成する
複雑なシステムを構築するときに、既存の部品の再利用は重要です。
他のインスタンスを結合する作業は、既存の部品を組み合わせてシステムを構築する点から、部品の「合成」と見なせます。単純なものから複雑なものを構築する様子は、インスタンス間の「委譲」によって説明できます。組立関係で結ばれるインスタンスは「全体/部分」構造を実現します。
事例:GUI コンポーネント
新たなクラスを定義するときには、インスタンス属性を定義します。属性には基本データ型の値のほかに、任意のクラスのインスタンスを指定できます。
Swingではフレーム内に任意の部品を配置して、複雑なアプリケーションを作成します。新規のLifeGameFrame
を構築するときには、既存のJButton
を再利用します。また、既存のJPanel
を拡張した、新規のLifeGamePanel
を利用します。このように新旧の部品を合成して、新規の部品LifeGameFrame
を構築します。
#------ after -------------------------------- class LifeGameFrame(DefaultFrame): def initialize(self): self.panel = LifeGamePanel() self.button = JButton("Next Generation", actionPerformed=self.actionPerformed) def actionPerformed(self, e): self.panel.nextGeneration()
メソッドactionPerformed
は、パネルLifeGamePanel
のインスタンスpanel
に対して、メソッドnextGeneration
の呼び出しを行います。すると、ボタンbutton
をクリックしたときに、パネルに生命体を表示します。つまり、メソッドの利用者が要求するサービスを提供するために、役割の一部を他のインスタンスに委譲します。これは、サービスを要求する側(送信者 sender)と、サービスを提供する側(受信者 receiver)とが「メッセージを送受信」することで実現できます。