Skip to content

Instantly share code, notes, and snippets.

@mhlavac
Last active August 29, 2015 14:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mhlavac/465a0efc33ddaae61218 to your computer and use it in GitHub Desktop.
Save mhlavac/465a0efc33ddaae61218 to your computer and use it in GitHub Desktop.
Container vs Composite vs Chain
<?php
interface Greeter
{
public function greet($name);
}
class ChainGreeter implements Greeter
{
private $greeters = [];
public function addGreeter(Greeter $greeter)
{
$this->greeters[] = $greeter;
}
public function greet($name)
{
foreach ($this->greeters as $greeter) {
$greeter->greet($name);
}
}
}
class StringGreeter() implements Greeter
{
private $sentence;
public function __construct($sentence)
{
$this->sentence = $sentence;
}
public function greet($name)
{
spritnf($sentence, $name);
}
}
$chainGreeter = new ChainGreeter();
$chainGreeter->add(new StringGreeter('Hello %s'));
$chainGreeter->add(new StringGreeter('Good morning %s'));
$chainGreeter->greet('John Doe');
@pavel-dohnal-momentumft

@dmaicher
Copy link

Haha the naming problem :)

Would agree with @pavel-dohnal-momentumft. To me this seems like the composite pattern.

So CompositeGreeter? 😄

@mhlavac
Copy link
Author

mhlavac commented Jul 10, 2015

@pavel-dohnal-momentumft I also thought it's a composite, because this is how usuall composites are implemented.

So in the end I came with 2 ideas.

Command where we can use just __invoke. So it feels almost like named closure.

class GreetCommand
{
    /**
     * @var Greeter[]
     */
    private $greeters;

    public function __construct(array $greeters = [])
    {
        $this->greeters = $greeters;
    }

    public function __invoke($name)
    {
        foreach ($this->greeters as $greeter) {
            $greeter->greet($name);
        }
    }
}

And simple Greeters, because it's just multiple Greeters anyway.

class Greeters
{
    /**
     * @var Greeter[]
     */
    private $greeters;

    public function __construct(array $greeters = [])
    {
        $this->greeters = $greeters;
    }

    public function greet($name)
    {
        foreach ($this->greeters as $greeter) {
            $greeter->greet($name);
        }
    }
}

What do you think? ;-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment