27 / 06 / 2009

adapter design pattern – php

ekleyen: Emre Çevik kategori: design patterns| php

Adapter (adaptör) tasarım şablonu davranışsal (Structural Patterns) tasarım şablonudur ve var olan 2 sınıfı bir birine bağlama görevi görür. Böylece bu birbirine bağladığımız iki sınıfın eski yapılarını korumuş oluruz.

Konuyu daha iyi anlamak için örneğimize göz atalım.

Örneğimizde 2 adet sınıfımız olmalı ve biz Adapter sınıfı ile bunları bir birine bağlamalıyız. Örnek olarak 2 sınavda alınan notların ortalamasını yazan bir uygulama yapalım.

adapter

1. sınıfımız öğrencilerin bilgilerinin bulanacağı sınıf.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Ogrenci
{
    public $isim;
    public $not1;
    public $not2;
    public function __construct( $isim, $not1, $not2 )
    {
        $this->isim = $isim;
        $this->not1 = $not1;
        $this->not2 = $not2;
    }
}
 
class OgrenciNotlari
{
    private $array = array();
 
    public function kayitEkle($isim, $not1, $not2)
    {
        $this->array []= new Ogrenci( $isim, $not1, $not2 );
    }
 
    public function kayitGetir()
    {
        return $this->array;
    }
}
?>

2. sınıfımız ise öğrencilerden gelen not bilgileri hesaplayacak olan sınıf olsun

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
abstract class AbstractOrtalama
{
    abstract function mevcutGetir(  );
    abstract function isimGetir( $row );
    abstract function not1Getir( $row );
    abstract function not2Getir( $row );
}
 
class Ortalama
{
    private $data;
 
    public function __construct( $data )
    {
        $this->data = $data;
    }
 
    public function hesapla()
    {
        $mevcut = $this->data->mevcutGetir();
        for($i = 0; $i < $mevcut; $i++)
        {
            $ortalama = ( $this->data->not1Getir( $i ) + $this->data->not2Getir( $i ) ) / 2;
            echo $this->data->isimGetir( $i ) .' - '. $ortalama .'<br>';
        }
    }
 
}

3. sınıfımız ise bu 2 sınıfı birbirine bağlayacak olan Adapter sınıfı

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Adapter extends AbstractOrtalama
{
    private $array;
 
    public function __construct( $rl )
    {
        $this->array = $rl->kayitGetir();
    }
 
    public function mevcutGetir()
    {
        return count($this->array);
    }
 
    public function isimGetir( $get )
    {
        return $this->array[ $get ]->isim;
    }
    public function not1Getir( $get )
    {
        return $this->array[ $get ]->not1;
    }
 
    public function not2Getir( $get )
    {
        return $this->array[ $get ]->not2;
    }
}

evet şimdi bu sınıflar ile nasıl çalışacağımıza göz atalım

1
2
3
4
5
6
7
8
9
$ogrenci = new OgrenciNotlari; // öğrenci sınıfını oluştur
 
$ogrenci->kayitEkle('emre', 50, 70); // yeni ogrenci ekle
$ogrenci->kayitEkle('erdem', 90, 80); // yeni ogrenci ekle
 
$adapter = new Adapter( $ogrenci ); // adapter sınıfını oluştur - öğrenci bilgilerini adapter sınıfına sokuyoruz
 
$hesapla = new Ortalama( $adapter );  // öğrenci bilgilerini bulunduran adapter sınıfını ortalama hesaplayan sınıfa gönderiyoruz
$hesapla->hesapla();

uygulamamızın ekran çıktısı

emre – 60
erdem – 85

evet bu yazımızda burada son buluyor. umarım açıklayıcı olmuştur.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
abstract class AbstractOrtalama
{
    abstract function mevcutGetir(  );
    abstract function isimGetir( $row );
    abstract function not1Getir( $row );
    abstract function not2Getir( $row );
}
 
class Ortalama
{
    private $data;
 
    public function __construct( $data )
    {
        $this->data = $data;
    }
 
    public function hesapla()
    {
        $mevcut = $this->data->mevcutGetir();
        for($i = 0; $i < $mevcut; $i++)
        {
            $ortalama = ( $this->data->not1Getir( $i ) + $this->data->not2Getir( $i ) ) / 2;
            echo $this->data->isimGetir( $i ) .' - '. $ortalama .'<br>';
        }
    }
 
}
 
class Ogrenci
{
    public $isim;
    public $not1;
    public $not2;
    public function __construct( $isim, $not1, $not2 )
    {
        $this->isim = $isim;
        $this->not1 = $not1;
        $this->not2 = $not2;
    }
}
 
class OgrenciNotlari
{
    private $array = array();
 
    public function kayitEkle($isim, $not1, $not2)
    {
        $this->array []= new Ogrenci( $isim, $not1, $not2 );
    }
 
    public function kayitGetir()
    {
        return $this->array;
    }
}
 
class Adapter extends AbstractOrtalama
{
    private $array;
 
    public function __construct( $rl )
    {
        $this->array = $rl->kayitGetir();
    }
 
    public function mevcutGetir()
    {
        return count($this->array);
    }
 
    public function isimGetir( $get )
    {
        return $this->array[ $get ]->isim;
    }
    public function not1Getir( $get )
    {
        return $this->array[ $get ]->not1;
    }
 
    public function not2Getir( $get )
    {
        return $this->array[ $get ]->not2;
    }
}
 
$ogrenci = new OgrenciNotlari;
 
$ogrenci->kayitEkle('emre', 50, 70);
$ogrenci->kayitEkle('erdem', 90, 80);
 
$adapter = new Adapter( $ogrenci );
 
$hesapla = new Ortalama( $adapter );
$hesapla->hesapla();
?>
dosya : adapter design pattern
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • BlinkList
  • blogmarks
  • description
  • Furl
  • Ma.gnolia
  • NewsVine
  • Reddit
  • Technorati

benzer konular:

  1. decorator design pattern – php
  2. proxy design pattern – php
  3. flyweight design pattern – php
  4. iterator design pattern – php
  5. bridge design pattern – php
  6. strategy design pattern – php
  7. facade design pattern – php
  8. composite design pattern – php
  9. singleton design pattern – php
  10. builder design pattern – php


(1 votes, average: 5.00 out of 5)
Loading ... Loading ...

5 yorum

1 | Muharrem ERİN

25 / 08 / 2009 - 03:53

Avatar

Tebrikler, çok güzel bir makale.
Kendi sınıflarımı bu şekilde birbirine bağlayarak küçük çaplı bir MVC yapısı oluşturmaya çalışıyorum. Makaleniz ışık tuttu, tekrar teşekkürler :)

Bu yazıyı okuyanların şu linklere de göz atmalarını öneririm:
http://www.phppatterns.com/docs/design/adapters_and_proxy_patterns
http://www.phppatterns.com/docs/design/mvc_pattern_version_2

2 | Emre Çevik

25 / 08 / 2009 - 10:15

Avatar

işinize yaradıysa ne mutlu. çok fazla kişiye hitap etmesede yazıların okunduğunu bilmek sevindirici.

3 | Muharrem ERİN

25 / 08 / 2009 - 12:39

Avatar

Bence bu şekilde devam edin :)
Genelde bu tip yazılara yabancı sitelerde rastlıyoruz, bu şekilde Türkçe makalelerin yayınlanması çok sevindirici.
İyi çalışmalar.

4 | necronomicon

07 / 09 / 2009 - 10:10

Avatar

Merhaba , makale için teşekkür ederim. Kendime özel hazırladığım mvc’de database driver yapısı için baya uğraşıyordum nasıl ve ne şekilde , neler gerekli diyerekten baya araştırdım. bu konu bana ışık tuttu. Velhasıl bir sorum olacak abstract yerine interface class ı uygulasak olmaz mı ?

5 | Emre Çevik

07 / 09 / 2009 - 22:57

Avatar

abstract yerine interface de kullanabilirsiniz veya 2 sinide kullanmayabilirsiniz. ( ozellikle bu ornekte abstract sınıfın methodları boş oldugundan dolayı fazla birşey farketmeyecektir. )

bu aralar sınavlara çalıştığım için zaman bulamıyorum.. fakat ilk zaman buldugumda biraz daha araştırma yapıp abstract ve interface uzerine ayrıntılı bir yazı yazmayı dusunuyorum.

yorum yaz

ne yapıyoruz

eğleniyoruz?

anket

design pattern yazılarını nasıl buldunuz?

sonuçlar

Loading ... Loading ...