Süzgeç Tasarım Deseni

Share Button

Belirli bir nesne grubunun bir veya daha fazla kritere göre filtrelenebilmesini sağlayan yapısal tasarım desenidir. Tanımdan da anlaşılacağı üzere filtreleme işlemi tekil veya zincir halinde gerçekleştirilebilir.

Gerçek Hayat Örneği:

Dilerseniz bu örneği Dekoratör Tasarım Deseni yazısında söz ettiğimiz e-ticaret uygulaması üzerinden devam ettirelim.

Kısaca hatırlatmak gerekirse sitemizden aynı kategoriden 3 ürün alan müşteriye 2 fiyatı ödetecek ve 10 TL indirim vereecktik. Bu işlemi yaparken dekoratör ve strateji tasarım desenlerinden yararlanmıştık. Şimdi bu örneği biraz daha özelleştirelim.

Kullanıcımızın, yeni yıl kategorisinden satın alacağı 3 adet 100 TL üzeri ürün için 2 fiyatı ödetelim ve 10 TL indirim uygulayalım.

Uygulama:

Örnekde belirttiğimiz şartlara uygun olan sepet ürünlerini filtrelemek için oluşturacağımız filtrelerin implement edeceği arayüz sınıfını oluşturalım.
[code lang=”php”]
getCategory()->getId() == $args[‘category_id’] ) {
yield $item;
}
}
}
}
[/code]

Bir sonraki ölçütümüz olan tutar bilgisi için yeni bir filtre sınıfı oluşturalım.
[code lang=”php”]
getPrice() == $args[‘price’]) {
yield $item;
}
break;
case self::CRITERIA_LESS_THAN:
if($item->getPrice() < $args['price']) { yield $item; } break; case self::CRITERIA_GREATER_THAN: if($item->getPrice() > $args[‘price’]) {
yield $item;
}
break;
case self::CRITERIA_LESS_THAN_OR_EQUAL:
if($item->getPrice() <= $args['price']) { yield $item; } break; case self::CRITERIA_GREATER_THAN_OR_EQUAL: if($item->getPrice() >= $args[‘price’]) {
yield $item;
}
break;
}
}
}
}
[/code]

Son olarak her iki şartı VE lojiğine tabi tutacak filtre sınıfını oluşturalım.
[code lang=”php”]
filter1 = $filter1;
$this->filter2 = $filter2;
}

/**
* @param Traversable $items
* @param array $args
* @return Generator
*/
public function apply(Traversable $items, array $args=array())
{
$filtered = $this->filter1->apply($items, $args);
return $this->filter2->apply($filtered, $args);
}
}
[/code]

Filtrelerimiz hazır olduğuna göre bir önceki örnekde oluşturduğumuz SpecialOfferCalculator sınıfını yeni şartlara göre düzenleyelim.
[code lang=”php”]
apply(
$this->decoratedObject->getItems(),
array(
‘category_id’ => self::OFFER_CATEGORY_ID,
‘price’ => self::OFFER_PRICE_LIMIT,
‘condition’ => self::OFFER_PRICE_COND
)
);

// Generator tip, iterate edilmedigi surece sonuc donmedigi icin,
// bir sonraki metodda yapilacak belirli kategorideki urun sayisi
// kontrolu nedeniyle generator tipini diziye donusturuyoruz.
$items = array();
foreach($filteredItems as $item) {
$items[] = $item;
}
return $items;
}

public function getTotalPrice()
{
$totalPrice = $this->decoratedObject->getTotalPrice();
$items = $this->prepareItems();

if(count($items) > self::OFFER_LIMIT) {
// Urunleri pahalidan ucuza siralayarak 100 TL ve uzeri en ucuz
// urunun tutarini indirim olarak uyguluyoruz.

usort($items, function($itemA, $itemB) {
return $itemA->getPrice() > $itemB->getPrice();
});

$totalPrice -= end($items)->getPrice();
}
return $totalPrice;
}
}
[/code]

Artık sepet tutarımızı hesaplamaya hazırız.
[code lang=”php”]
add(new BasketItem(“001”, new Category(5, ‘Yeni Yıl’), ‘Gömlek’, 150))
->add(new BasketItem(“001”, new Category(5, ‘Yeni Yıl’), ‘Gömlek’, 180))
->add(new BasketItem(“001”, new Category(5, ‘Yeni Yıl’), ‘Gömlek’, 105))
->add(new BasketItem(“002”, new Category(5, ‘Yeni Yıl’), ‘Pantolon’, 80);
$basket->setDiscount(new Discount(Discount::DISCOUNT_TYPE_FIXED, 10));
$basket = new DiscountCalculator(
new SpecialOfferCalculator(
new TotalPriceCalculator($basket)
)
);
print $basket->getTotalPrice();
// sub total = 150 + 180 + 105 + 80 = 515
// ofered total = sub total – 105 = 410
// Payment total = offered total – discount amount (10) = 405 TL
}
}
[/code]

Share Button

About İbrahim Gündüz

1983 yılında İstanbul’da doğdu. İlkokul yıllarında cobol ve basic le olan tanışması, yazılıma olan ilgisini arttırdı 2005 yılında. Uludağ Üniversitesi Teknik Bilimler Meslek Yüksek Okulu Elektronik bölümünden mezun olan Gündüz, çeşitli alanlarda faaliyet gösteren kurumlarda yazılım geliştirici olarak görev almıştır.
Mesleki ilgi alanları, ölçeklenebilir sistemler, uygulama entegrasyonları ve ödeme sistemleridir.
Halen Markafoni back end geliştirici olarak çalışmaktadır.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir