Imagine an audio system consisting of individual songs and also playlists of songs. Yes, playlists consist of songs, but we want both to be treated individually. Both are types of music, both can be played.
The Composite design pattern can help here; it allows us to ignore the differences between compositions of objects and individual objects. It allows us to treat both with identical or nearly-identical code.
Let's put together a little example; a song is our example of a leaf, with playlists being composites. Music
is our abstraction of playlists and songs; therefore, we can call this our component. The client of all this is our index.php
file.
By not discriminating between leaf-nodes and branches, our code becomes less complex and therefore less error prone.
Let's start by defining an interface for our Music
:
<?php interface Music { public function play(); }
Now let's put together some implementations, starting with our Song
class:
<?php...