Это паттерн компоновщик (Composite) нужен совет !

texrdcom

Новичок
Это паттерн компоновщик (Composite) нужен совет !

Читаю книгу банды 4 стараюсь создать паттерны которых не сущесвовало на php на сайте phppattern.com(Который умер)
но у меня сохранились файлы с данного сайта http://www.webfile.ru/517924
_______________________
можно назвать ниже приведенный код паттерном компоновщиком (composite) ? - правильно ли создан макет данного паттерна ?
Может кто то уже занимался такой работой и поделиться примерами паттернов -? на php.
PHP:
/**
 * @version 1.0
 * @created 14-сен-2005 10:48:47
 */
abstract class craphis
{

	public function Draw()
	{
	}

	public function Addgraphis()
	{
	}

	public function Remove()
	{
	}

	public function Get()
	{
	}

}

class Picsture extends craphis
{

	public $m_craphis;
	public $all_ris;

     
	public function Draw($obekt)
	{
		$this->m_craphis=new $obekt;
		$this->Addgraphis($this->m_craphis->Draw());	
	}

	public function Addgraphis($ris)
	{
	$this->all_ris.=$ris;	
	}

	public function Remove()
	{
	}

	public function Get_craphis()
	{
	echo $this->all_ris;	
	}

}
/**
 * @version 1.0
 * @created 14-сен-2005 10:48:00
 */
class Line extends craphis
{


public function Draw()
	{
		return 'line';
	}

}
class Text extends craphis
{

	public function Draw()
	{
		return 'text';
	}

}
$a= new Picsture();
$a->Draw('text');
$a->Draw('line');
$a->Get_craphis();
 

Screjet

Новичок
Может, лучше использовать Decorator в твоем примере?:
PHP:
$pic_text = new Picture( new Text() );
$pic_text->Draw();
$pic_line = new Picture( new Line() );
$pic_line->Draw();
 

texrdcom

Новичок
Пример сугубо тестовый - в интернете негде нет паттерна КОМПОНОВЩИКА приведеного на php (декоратор - есть)
Компоновщик и декоратор различные вещи! потому я и спрашиваю мой пример можно назвать компоновщиком или нет ?

-~{}~ 14.09.05 13:25:

В догонку давайте вместе сделаем (на php) нехватающие декораторы, я думаю мы (все кто програмирует с помощью ооп на php :) ) будем не один раз их изпользовать.

-~{}~ 14.09.05 13:26:

Чуть попозже приведу список декораторов которые понарывал в инете и в ebook :) Их делать не надо!
 

texrdcom

Новичок
SiMM
Все ссылки на этой странице мертвые!
И ты там увидел реализацию на php ?
 

texrdcom

Новичок
Patterns Defined:
Singleton
Factory
Observer
Strategy
Да только эти и есть ведь других нет.
 

SiMM

Новичок
> В догонку давайте вместе сделаем (на php) нехватающие декораторы
> Чуть попозже приведу список декораторов которые понарывал в инете и в ebook
Ну так их в твоём списке не было. Я надеюсь, ты не думал, что я привожу ПОЛНЫЙ список?
Вообще имхо разумнее это размещать в
http://phpclub.ru/faq/DesignPatterns/Singleton
http://phpclub.ru/faq/DesignPatterns/Factory
& etc
 

texrdcom

Новичок
Да я все понимаю потому и задал вопрос,
по приведеному примеру \
правильно ли реализован компоновщик !
вот что меня интересует, не советы по другим паттернам, не ссылки (я их понаходил сам).
 

vitus

мимо проходил
можно назвать ниже приведенный код паттерном
нельзя код называть паттерном
правильно ли реализован компоновщик !
передран из книжки, добавлены ошибки

для чего ты написал этот код? какова мотивация?
где может быть применён этот паттерн на твой взгляд?

простой перевод примеров из книжки с C++ на PHP ничего не даёт
(даже правильный :) )
 

pachanga

Новичок
Re: Это паттерн компоновщик (Composite) нужен совет !

Автор оригинала: texrdcom
Читаю книгу банды 4 стараюсь создать паттерны которых не сущесвовало на php на сайте phppattern.com(Который умер)
Во-первых, спешу обрадовать, phppatterns никак не умер и скоро будет его перерождение, скорее всего в форме dokuwiki. Просто у Harry Fuecks были заботы личного плана.

можно назвать ниже приведенный код паттерном компоновщиком (composite) ? - правильно ли создан макет данного паттерна ?
Во-вторых, код приведенный тобой мне показался несколько сумбурным, поэтому я просто приведу пример использования данного паттерна.

Давайте вначале выясним, что же такое паттерн компоновщик(composite). Этот паттерн нужен для того, чтобы можно было динамически компоновать множество составляющих под некоторым единым интерфесом. При реализации данного паттерна возникают понятия контейнера и его составной части. Причем как контейнер, так и каждая составная часть реализуют один и тот же интерфейс и ничто не мешает один контейнер вкладывать в другой как часть.

Не поверите, как часто мы пользуемся этим замечательным паттерном! :)

Привожу пример из жизни, который возник совсем недавно([sid], помнишь? спасибо за идею :) ).

Нам потребовалось реализовать диспатчинг всех ошибок некоторым единым образом. Причем, хотелось сделать так, чтобы дополнительный функционал по обработке ошибок можно было бы добавлять динамически. Скажем, в серьезном приложении критические ошибки было бы неплохо не только записывать в лог, но также оповещать разработчиков по почте. Меньше всего хотелось городить god-like классы....

С чего начать? Предположим, у нас есть некоторый глобальный хендлер всех ошибок и исключительных ситуаций, которые могут возникнуть в приложении(в PHP этого можно достичь, используя set_error_handler и set_exception_handler). Этот хендлер реализует следующий интерфейс:

PHP:
interface ErrorDispatcher
{
  function exceptionDispatch($exception);
  function errorDispatch($errorNumber, $errorMessage, $fileName, $lineNumber, $arguments);
}
Допустим, у нас также есть некоторый BaseErrorDispatcher, который реализует интерфейс ErrorDispatcher самым базовым образом. Что-то наподобие этого:

PHP:
class BaseErrorDispatcher implements ErrorDispatcher
{
  function exceptionDispatch($exception)
  {
      echo "Exception catched type of " . get_class($exception) . "<BR/>\n";
      echo "Message: ".$exception->getMessage()."<BR/>\n";
      echo nl2br($exception->getTraceAsString());
  }

  function errorDispatch($errorNumber, $errorMessage, $fileName, $lineNumber, $arguments)
  {
    if ( (error_reporting() & $errorNumber) != 0 )
    {
      //тут мы немного схитрили: для
      //унификации обработки ошибок
      //выбрасывается также специальное PhpErrorException исключение
      //немного спорное решение, хотя...будущее покажет
      throw new PhpErrorException($errorMessage, $errorNumber, $fileName, $lineNumber);
    }

  static function setErrorDispatcher($handler)
  {
    set_error_handler(array($handler, 'errorDispatch'));
    set_exception_handler(array($handler, 'exceptionDispatch'));
  } 
}
Как это используется в приложении?

PHP:
BaseErrorDispatcher :: setErrorDispatcher(new BaseErrorDispatcher());
Звучит пока немного запутанно? Причем тут composite? Сейчас все прояснится. Напишем код компоновщика:

PHP:
class CompositeErrorDispatcher extends BaseErrorDispatcher
{
  protected $dispatchers = array();

  function exceptionDispatch($exception)
  {
    foreach ($this->dispatchers as $dispatcher)
    {
     $dispatcher->exceptionDispatch($exception);
    }
  }

  function addDispatcher($dispatcher)
  {
    $this->dispatchers[] = $dispatcher;
  }
}
Теперь можно реализовать дополнительные диспатчеры, которые мы добавим в компоновщик. Как насчет такого кода регистрации обработчиков ошибок:

PHP:
$c = new CompositeErrorDispatcher();
$c->addDispatcher(new BaseErrorDispatcher());
$c->addDispatcher(new ErrorLoggingDispatcher());
$c->addDispatcher(new ErrorMailingDispatcher());
BaseErrorDispatcher :: setErrorDispatcher($c);
После небольшой модификации CompositeErrorDispatcher можно несколько сократить запись:

PHP:
$c = new CompositeErrorDispatcher(
new BaseErrorDispatcher(),
new ErrorLoggingDispatcher(),
new ErrorMailingDispatcher());
BaseErrorDispatcher :: setErrorDispatcher($c);
Чего мы этим добились? Пользователи интерфейса ErrorDispatcher понятия не имеют о том, что имеют дело с компоновщиком, а мы имеем возможность динамически нанизывать дополнительный функционал как бусинки без нужды изменения интерфейса. Разве это не здорово? ;)
 

texrdcom

Новичок
мой код сугубо теретический - интерестно что тебя не устроило в нем ?
За пример спасибо хоть что то дельное.

-~{}~ 02.10.05 23:12:

Слушай тебе не кажеться что твой пример далеко не композитор а ближе к Декоратору ?
 

pachanga

Новичок
Конечно нет, декоратор - это несколько иная вещь. Декоратор применяется для прозрачного дополнения функционала(декорирования). Понятия контейнер и составные части не отражены в паттерне декоратор - в этом и заключается разница.

-~{}~ 03.10.05 11:01:

Автор оригинала: texrdcom
мой код сугубо теретический - интерестно что тебя не устроило в нем ?
Честно говоря, я не очень в нем разобрался....там к тому же очень много чисто синтаксических ошибок. Ты бы его привел несколько в порядок.
 

vitus

мимо проходил
Привожу цитату из той самой книги :)
(издательство "Питер" 2001 стр. 162)
Паттерн Composite
Назначение:
Компонует объекты в древовидные структуры для представления иерархий часть-целое. Позволяет клиентам единообразно трактовать индивидуальные и составные объекты.
Автор оригинала: texrdcom
мой код сугубо теретический - интерестно что тебя не устроило в нем ?
тема ... не раскрыта

вот собственно и всё что не устраивает
 

pachanga

Новичок
Приведу более ярко выраженный пример использования данного паттерна в виде небольшого test case:

PHP:
function testNestedCriterias()
{
    $c = new SQLCompositeCriteria();
    $c1 = new SQLRawCriteria('a=1');
    $c2 = new SQLRawCriteria('b=2');
    $c2->addOr(new SQLRawCriteria('c=3'));

    $c->addAnd($c1);
    $c->addAnd($c2);

    $values = array();
    $this->assertEqual($c->toStatementString($values), '(a=1 AND (b=2 OR c=3))');
}
 

vitus

мимо проходил
PHP:
$and = new SQLCompositeAnd();
$or =new SQLCompositeOr();

$a=new SQLRawCriteria('a=1');
$b=new SQLRawCriteria('b=2');
$c=new SQLRawCriteria('c=3');

$or->add($b); 
$or->add($c);

$and->add($a); 
$and->add($or);

$str = $and->prepare(array());
вот теперь точно компоновщик
 
Сверху