Proxy Kalıbı

Lokantaya gidip yemek yedikten sonra hesabi odemek icin kredi kartinizi uzattiniz. Lokanta sahibi de kredi kartinizi kullanarak banka hesabinizdan yediginiz yemegin (karniyarik, pilav, salata ve su) ucretini banka hesabinizdan cekti. simdi burda insan sormaz mi salata yerine neden cacik yemedin diye. ne diyorum ben ya ! acliktan kafamda karisti :) toparlayalim. burda kredi kartinin rolu nedir ? bankayla iletisim kurmanizi saglayan bir aracidir bir vekildir bir proxydir. amaca ulasmak icin bir aractir. banka hesabiniza kolay yoldan erismenin bir yoludur. kapitalizmin kucagina dusmus insanlarin daha kolay para harcamalarini temin etmek icin gelistirilmis plastik bir paradir. sifreleri olanlari da vardir, flexi olanlari da. insanlari intihara goturen cesitleri de vardir bunlarin. yine konudan saptik galiba.

pateximg12.gif

konumuza donecek olursak ortada bir adet gercek sinif bir adette vekil sinif vardir. gercek sinif uzaklarda bir yerlerde olabilir (ornek web servisleri), gercek sinif cok karmasik olabilir vs. vs. bu tip sorunlarin onune gecmek icin ise vatandaslar araya bir sinif daha eklemisler ve adina vekil sinif demisler. vekil sinifin icerisinden gercek sinifi kullanmayi akil etmisler. birazdan verecegimiz ornek pek kullanisli gelmeyebilir ama ise yarar bir noktasini soyle soyleyebilirim. delphi de wsdl importer araci ile internet uzerindeki bir web servisini aldiginiz zaman delphinin yaptigi is web servisini kolayca kullanabilmeniz icin otomatik bir vekil sinif olusturmaktir. siz bu vekil sinifa atifta bulunarak aslinda internet uzerindeki sinifi kullanmis olursunuz. buna remote proxies deniyor. virtual proxies ve protection proxies gibi iki cesidi daha var bu zimbirtinin.

simdi gelelim ornegimize….

IProxy = interface
Function OdemeYap(Tutar:Real):Boolean;
end;

vekil sinifin ve gercek sinifin kullanacagi arabirimimiz. bu arabirim sayesinde her iki nesnede de OdemeYap adli fonksiyonun olmasini garanti altina almis oluyoruz. illa interface mi kullanmak gerekli ? hayir. vekil ve gercek nesneyi ortak bir atadan da turetip OdemeYap fonksiyonunu ezebilirdik. OdemeYap fonksiyonu illa her iki nesnede de varolmak zorunda mi? hayir. pasa gonlun bilir. birisinde OdemeYap digerinde OdemeyiYapUlan gibi bir fonksiyon kullanabilirsin ama ne gerek var ulan. ikisinin ismini de ayni yap ki ilerde kafan karismasin :)

TBankaHesabi = class(TInterfacedObject,IProxy)
public
function OdemeYap(Tutar:Real): Boolean;
end;



{ TBankaHesabi }

function TBankaHesabi.OdemeYap(Tutar:Real): Boolean;
begin
//burdaki kod uzak bir makinede yer alabilecegi gibi (web servisleri gibi)
//cok karmasik islemlerde gerceklestiriyor olabilir.

if tutar

gercek sinifimiz bu. asil isi yapan sinif yani.

TKrediKarti = class(TInterfacedObject,IProxy)
Private
fBankaHesabi:TBankaHesabi;
public
constructor Create;
destructor Destroy;
function OdemeYap(Tutar:Real): Boolean;
end;

...
...
...

{ TKrediKarti }

constructor TKrediKarti.Create;
begin
fBankaHesabi :=TBankaHesabi.Create;
end;

destructor TKrediKarti.Destroy;
begin
FreeAndNil(fbankahesabi);
end;

function TKrediKarti.OdemeYap(Tutar:Real): Boolean;
begin
Result :=fBankaHesabi.OdemeYap(Tutar);
end;

bu da vekil sinif. dikkat edeceginiz gibi fBankaHesabi adli bir degiskene sahip. bu bizim gercek nesnemis. TKrediKarti.OdemeYap fonksiyonunun yaptigi tek sey ise fBankaHesabi.OdemeYap fonksiyonunu cagirip donen degeri geriye dondurmek. kulagimizi tersten gostermek gibi birseye benziyor ama gavur icat ettiyse bi bildigi vardir :)

procedure TForm1.Button1Click(Sender: TObject);
var
KrediKarti:TKrediKarti;
begin
KrediKarti :=TKrediKarti.Create;

try
if KrediKarti.OdemeYap(strtoint(Edit1.Text)) then
ShowMessage(’islem basarili’)
else
ShowMessage(’islem basarisiz’);
finally
FreeAndNil(KrediKarti);
end;

end;

bu da butonumuzun kodlari

0 Responses to “Proxy Kalıbı”


  1. No Comments

Leave a Reply