Как это неравноправные? Они все поддерживают единый интерфейс. Просто было выбрано такое решение(а не твое) чисто из-за удобства использования. Скажем в твоем случае нельзя сделать следующим образом, т.к тебе потребуется делать вспомогательные композиты:Автор оригинала: vitus
твой пример не компоновщик, у тебя равноправные 'b' и 'c' неравноправны,
$a = new SQLRawCriteria('a=1');
$a->addAnd(SQLRawCriteria('b=2'))->addAnd(new SQLRawCriteria('c=3'));
//жаль, что php не поддерживает такие фокусы:
//$a = new SQLRawCriteria('a=1')->addAnd(SQLRawCriteria('b=2'))->addAnd(new SQLRawCriteria('c=3'));
Очень интересно, можешь доказать?скорее 'b' декорирован с помощью 'c'
такчто - декоратор тут правильное слово
они в дереве неравноправны, а по идее компоновщика должны быть, к примеру - удали 'b', не удаляя 'c'.Как это неравноправные? Они все поддерживают единый интерфейс.
ну и правильно, только оно от этого не стало компоновщиком, а мы ведь тут про компоновщик флудим.Просто было выбрано такое решение чисто из-за удобства использования.
Ок, я с тобой соглашусь в том моменте, что предложенный мною вариант не является имплементацией данного паттерна в чистом виде.Автор оригинала: vitus
только оно от этого не стало компоновщиком, а мы ведь тут про компоновщик флудим.
$a='a';
$b='b';
$b.='c';
$a.=$b;
echo $a;
// abc
зачем так утрировать?Автор оригинала: vitus
это тоже модифицированный компоновщик?PHP:$a='a'; $b='b'; $b.='c'; $a.=$b; echo $a; // abc
ты в этом уверен? $c1->addOr($c2->addAnd($c3)); - здесь нет древовидной структуры?на самом деле твоя иллюстрация не является компоновщиком, поскольку не строит "древовидные структуры для представления иерархий часть-целое" и имеет по меньшей мере два метода для строительства
$a.=$b.$c;ты в этом уверен? $c1->addOr($c2->addAnd($c3)); - здесь нет древовидной структуры?
Я не говорю что я прав на 100% я просто говорю человеку что ошибок в моем коде нет!Автор оригинала: vitus
texrdcom
иди книжку читай до просветления
pachanga
твой второй пример больше похож на буффер какойта, согласись,
типа SQLBufferedBuilder (не путать с паттерном билдер, там ещё директор есть) , и не обижайся плиз.
А про декоратор я соврал, беру слово обратно, каюсь, был неправ.
//php4
class AbstractComponent{
function getProduct(){
//abstract
}
}
class AbstractComposite extends AbstractComponent{
var $comp;
function AbstractComposite(){
$this->comp=array();
}
function add($criteria){
$this->comp[]=$criteria;
}
}
class SQLRawCriteria{
var $criteria;
function SQLRawCriteria($criteria){
$this->criteria=$criteria;
}
function getProduct(){
return $this->criteria;
}
}
class SQLCompositeAnd extends AbstractComposite{
function getProduct(){
$result="";
foreach($this->comp as $comp){
$result.=$result?" AND ".($comp->getProduct()):$comp->getProduct();
}
return "(".$result.")";
}
}
class SQLCompositeOr extends AbstractComposite{
function getProduct(){
$result="";
foreach($this->comp as $comp){
$result.=$result?" OR ".($comp->getProduct()):$comp->getProduct();
}
return "(".$result.")";
}
}
///////////////////test
$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->getProduct();
echo $str;
- похвальнодля чего ты написал этот код? - стараюсь разобраться с ооп
гораздо важнее понимать их назначение и каким образом оно реализуется, а решения зависят от задачи.какова мотивация? - знать правильное решения паттернов на php
слишком обобщённо, незачотгде может быть применён этот паттерн на твой взгляд?
для построения системы cmf как возможность наращивать
Возрадуемся http://www.phppatterns.com/docs/startАвтор оригинала: texrdcom
Читаю книгу банды 4 стараюсь создать паттерны которых не сущесвовало на php на сайте phppattern.com(Который умер)