PHPで学ぶデザインパターン Advent Calendar 2018で間に合わなかった記事。
機能拡張のためのスーパークラスと実装拡張のためのサブクラスを用意し、機能の橋渡しをするようなパターン。
<?php
interface Connector
{
public function __construct(Converter $converter);
public function connect();
}
class IphoneConnector implements Connector
{
private $converter;
public function __construct(Converter $converter)
{
$this->converter = $converter;
}
public function connect()
{
echo 'Iphone connect by using ' . $this->converter->getTerminalName();
}
}
class AndroidConnector implements Connector
{
private $converter;
public function __construct(Converter $converter)
{
$this->converter = $converter;
}
public function connect()
{
echo 'Android connect by using ' . $this->converter->getTerminalName();
}
}
interface Converter
{
public function getTerminalName();
}
class LightningConverter implements Converter
{
public function getTerminalName()
{
return 'lightning';
}
}
class TypeCConverter implements Converter
{
public function getTerminalName()
{
return 'type-c';
}
}
$lightingConveter = new LightningConverter();
$typeCConverter = new TypeCConverter();
// どっちのconverterを使ってもよい→実装を切り替えられる
$iphoneConnector = new IphoneConnector($lightingConveter);
$androidConnector = new AndroidConnector($typeCConverter);
$iphoneConnector->connect(); // connect by using lighting
$androidConnector->connect(); // connect by using type-c
これは単純なインターフェースの使い方ではないかと思ってしまったのはまだ理解が浅いからな気がする。