View on GitHub

adventure-cube

Compositパターン

再帰処理を使う時に、よく使うパターンです。
このパターンだからこそ、再帰処理が必要になる、という事例かもしれません。

同一視できるオブジェクトを定義する

ファイルシステムがよく例に出されます。
なのでファイルシステムで考えてみましょう。

フォルダを消すと、中にあるファイルも全部消えますよね。
中にフォルダがあって、その中にファイルがあって…というのも全部消えますよね。
そういう処理ができるようにするパターンだと思ってください。

「消える」実装を統一すること

子供を持っているオブジェクトに対して、「オブジェクトを消す」という処理をするときに、期待する挙動は「子供も一緒に消える」ですよね。
これを実装することを考えます。
基本的には「子供に責任を持つ」という実装をとることが多いです。

再帰処理を考えてみましょう。

親は子供と一緒に消えてほしいので、親は消える時に、子供それぞれに対してそれぞれ「オブジェクトを消す」命令を発行します。
このとき、もし子供がさらに子供を持っていたら…というのを考えてみてください。
これが再帰処理の基本的な考え方です。