Разделяет абстракцию и реализацию так, чтобы они могли меняться независимо. Вместо множества подклассов (Shape+Color комбинации) - две иерархии: абстракция и реализация.
interface Renderer { public function renderCircle(float $r): string; }
class VectorRenderer implements Renderer { ... }
class RasterRenderer implements Renderer { ... }
abstract class Shape {
public function __construct(protected Renderer $renderer) {}
}
class Circle extends Shape { ... }Новые формы и новые способы отрисовки добавляются без взрывного роста классов.