Приведенный ниже код - это то, что я только что написал после прочтения немного шаблонов проектирования, и я хочу знать, есть ли у меня суть этого. Предполагается, что он реализует шаблон проектирования Mediator, а также использует интерфейсы поверх реализации и шаблон проектирования Factory.
<?php
interface iNav_Walker
{
public function walk();
}
class Nav_Walker
{
public static function factory()
{
$class_name = 'Generic_Nav_Walker';
$class_name = filter( 'nav_walker_class', $class_name );
$object = new $class_name;
return $object;
}
private function __construct()
{
return FALSE;
}
}
class Generic_Nav_Walker implements iNav_Walker
{
public function walk()
{
echo 'Generic Nav Walker';
}
}
class Custom_Nav_Walker implements iNav_Walker
{
public function walk()
{
echo 'Custom Nav Walker';
}
}
class MyPlugin
{
public static function use_custom_walker( $walker_class )
{
return 'Custom_Nav_Walker';
}
}
add_filter( 'nav_walker_class', array( 'MyPlugin', 'use_custom_walker_class' ) );
$nav_walker = Nav_Walker::factory();
$nav_walker->walk();
Очевидным преимуществом этого подхода является простота замены класса приложения по умолчанию на пользовательский. Ваш пользователь может даже расширить исходный класс и просто переопределить один метод, не так ли? Как это:
<?php
class Generic_Nav_Walker implements iNav_Walker
{
public function walk()
{
echo 'Generic Nav Walker';
}
public function other_func()
{
// Do something
}
public function other_func2()
{
// Do something
}
}
class Custom_Nav_Walker extends Generic_Nav_Walker implements iNav_Walker
{
public function walk()
{
echo 'Custom Nav Walker';
}
}
Потому что вы можете пожелать изменить только небольшую часть класса, или это плохая практика?