Template Tasarım Deseni Web Uygulaması

by Yusuf Karatoprak 10. Mart 2009 19:04

Bu makalemizde davranışsal tasarım desenlerinden biri olan Template tasarım deseninin web uygulamasını göreceğiz. Template tasarım deseninde metodlar önce bir soyut sınıf içinde tanımlanır. Soyut sınıfımız bir sınıfa kalıtım verdikten sonra override metodu ile soyut sınıf içinde tanımlanan metodlar istenilen şekilde geliştirilir. Sınıf sayısında bir limit yoktur. Template tasarım deseninin strategy deseninden farkı rutin işlemleri farklı metodlara ayırarak geliştirmek sonra tek bir metod içinde hepsini toplayıp, tekbir metod gibi tekrar çağırmaktır. Örnek vermek gerekirse veritabanına bağlantı, veritabanı işlemleri ve veritabanı bağlantı kapatma işlemleri tekbir çatı altında taplanabileceği gibi Bağlatı (Connection) metodu, İşlemler(CommandMetodu) ve bağlantıKapama(DisConnection) metodu olarak 3 ayrı yordam altındada yapılabilir. Kod geliştirme esnasında bu oldukça verimli bir yöntemdir. Ama kod geliştirici bu yordamları tek bir yordam altında kullanacaktır.



Abstract class soyutsınıf
{
Void Metod1();
Void Metod2();
Void Metod3();
Void Run()
{
Metod1();
Metod2();
Metod3();
}
}
Class mssql : soyutsınıf
{
}
Class oracle : soyutsınıf
{
}
Class access : soyutsınıf
{
}


Yukarıdaki kod blogu Template tasarım deseni hakkında tam bir bilgi verecektir. Şimdi Default.aspx sayfasına bakalım.



Soyutsınıf() sinif = new mssql();
Sinif.Run();

Yukarıdaki kod blogu Default.aspx sayfasına yazılmalıdır. Bu kod ilgili kod blogu olarak, mssql sınıfını çağıracaktır. Mssql sınıfının altında Connection,Command ve DisConnection işlemleri gerçekleştirilir. Bu işlemlerin gerçekleştirilmesi Run() metodu ile olacaktır. Çünkü hepsi tek bir metod altında toplanmasaydık şöyle bir kargaşaya girecektik.


Soyutsınıf() sinif = new mssql();
Sinif. Metod1 ();
Sinif. Metod2 ();
Sinif. Metod3 ();

Yukarıdaki her bir metod tek bir metod altından çağrılarak işlem kodlama esnasında basit ve anlaşılır hale getirilir.Şimdi UML diagramımızı görelim.

Yukarıdaki BaseTemplate Soyut sınıfı 4 adet metod içermektedir. dbaseCommand, dbaseConnection, dbaseDisConnection geliştirme esnasında kodlayıcı tarafından istenilen sınıflarda, soyut sınıf kalıtım verdirildikten sonra override ile geliştirilirler. Aslında tümleşik olarak bir metod olan ama ayrı ayrı olarak geliştirilen yordamlardır. RUN metodu ise çağrıldığında bu 3 metod tek bir metod altında çalışır. Tek seferde tek metod altında kullanılır. Biz bir metod çağıracağız. O metod Run metodu olacak. Tek seferde çağrılan bu metod altında birden fazla metoduda çalıştıracak.BaseTemplate soyut sınıfı incelenir ise;


public abstract class BaseTemplate
{
public abstract void dbaseConnnection(string conkey);
public abstract void dbaseCommand(string sp, ListDictionary ld);
public abstract void dbaseDisConnection();
public void RUN(string conkey, string sp, ListDictionary ld)  // TemplateMethod
{
dbaseConnnection(conkey);
dbaseCommand(sp, ld);
dbaseDisConnection();
}
}


Yukarıda 3 adet metod ve bu metodların toplanıldığı bir RUN() metodu göze çarpar. Şimdi sınıfımızı adları MsSqlProcess, OracleProcess, AccessProcess sınıflarına kalıtım verelim ve soyut sınıf altında tanımlanan metodları 3 ayrı sınıf altında değişik şekillerde geliştirebilir. Burada 3 metod 3X3 den 9 kere değişik şeillerde geliştirildi.

Aşağıdaki kodlara bakalım.


public class MsSqlProcess : BaseTemplate
{
public SqlConnection con;
public override void dbaseConnnection( string conkey)
{
con = new SqlConnection(WebConfigurationManager.ConnectionStrings[conkey].ToString());
con.Open();
}
public override void  dbaseCommand(string sp, ListDictionary ld)
{
SqlCommand cmd = new SqlCommand(sp, con);
cmd.CommandType = CommandType.StoredProcedure;
foreach (string key in ld.Keys)
{
cmd.Parameters.AddWithValue(key, ld[key]);
}
cmd.ExecuteNonQuery();
}
public override void dbaseDisConnection()
{
con.Dispose();
}
}

Şimdide bu kodları Default.aspx sayfamızda işletelim. Aşağıdaki tasarımı gerçekleştiriniz.


<div>
<h1>Template Design Pattern Deneme Web Sitesi</h1>
</div>
<div style="width:100%; height:100%">
<table style="width:100%; height:500px">
<tr><td valign="top"
style="border: Solid 1px Black; height:100%; width:20%" > <table> <tr><td> <asp:LinkButton ID="LinkProduct" runat="server" OnClick="LinkProduct_Click">
Add Product</asp:LinkButton></td></tr> <tr><td><asp:LinkButton ID="LinkCustomer" runat="server" OnClick="LinkCustomer_Click">
Add Customer</asp:LinkButton></td></tr> <tr><td><asp:LinkButton ID="LinkDetail" runat="server" OnClick="LinkDetail_Click">
Add CustomerDetail</asp:LinkButton></td></tr> </table> </td><td valign="top" style="border: Solid 1px Black; height:100%" > <br /><br /> <table><tr><td style="height: 26px">Model</td><td style="height: 26px">:</td> <td style="height: 26px"><asp:TextBox ID="TextBoxModel" runat="server">
</asp:TextBox></td></tr> <tr><td>Marka</td><td>:</td> <td><asp:TextBox ID="TextBoxMarka" runat="server"></asp:TextBox></td></tr> <tr><td>Fiyat</td><td>:</td> <td><asp:TextBox ID="TextBoxFiyat" runat="server"></asp:TextBox></td></tr> <tr><td>Tarih</td><td>:</td> <td><asp:TextBox ID="TextBoxTarih" runat="server"></asp:TextBox></td></tr> </table> </td></tr></table> </div>

Default.aspx altında girilen değerler bir alt yordama gönderilecektir.


public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void LinkProduct_Click(object sender, EventArgs e)
{
AddProduct();
}
protected void LinkCustomer_Click(object sender, EventArgs e)
{
AddCustomer();
}
protected void LinkDetail_Click(object sender, EventArgs e)
{
AddCustomerDetail();
}
void AddProduct()
{
Product product= new Product();
product.AddProduct(TextBoxModel.Text,
TextBoxMarka.Text,
float.Parse(TextBoxFiyat.Text),
DateTime.Parse(TextBoxTarih.Text));
}
void AddCustomer()
{
//Müşteriler Eklenir
}
void AddCustomerDetail()
{
// Müşteri Detayı Eklenir.
}
}

Yukarıdaki metod altında soyut sınıf dan bir adet sınıf yaratılır.Sınıfın AddProduct metoduna ulaşılır.


class Product
{
public void AddProduct(string model, string marka, float fiyat, DateTime tarih)
{
ListDictionary listdic = new ListDictionary();
listdic.Add("@model", model);
listdic.Add("@marka", marka);
listdic.Add("@fiyat", fiyat);
listdic.Add("@resim", "1.jpg");
listdic.Add("@tarih", tarih);
baseprocess baseprs = new reachprocess();
baseprs.execute("conn", "[sp_InsertProducts]", listdic);
}
}

AddProduct metodu Product sınıfının altındadır. Aşağıdaki textboxlar doldurulması ile istenilen webform altında Product product = new Product() metodu ile yaratılır. AddProduct metodu işletilir. Product Classının altında daha önce anlattığım, strategy design patttern yöntemi ele alınmıştır.

Aşağıdaki kod blogu Strategy ve Template tasarım desenlerinin iç içe kullanıldığı bir kod blogudur. Baseprocess soyut sınıfı altında tanımlanan execute metodu bir üst sınıfda override edilmiştir.


abstract class baseprocess
{
public abstract void execute(string conkey, string sp, ListDictionary ld);
}
class reachprocess : baseprocess
{
public override void  execute(string conkey, string sp, ListDictionary ld)
{
BaseTemplate basetemp = new MsSqlProcess();
basetemp.RUN(conkey, sp, ld);
}
}

Template kısmı ise reachprocess sınıfında karşımıza çıkar. BaseTemplate MsSqlProcess’i yaratır. Basetemplate altındaki Run metodu ile connection,command,disconneciton metodları işliyor. Yukarıdaki Product sınıfı altında çalıştırılan AddProduct metoduna dikkat ediniz. Bu metod altında baseprocess soyut sınıfı reachprocess sınıfını yaratacaktır. Altında bir execute metodu çağrılacaktır. Execute metodunu incelediğimizde soyut sınıfımızın metodlarını topladığımız RUN metodunu rahatlıkla görebiliriz.

Demo:

TemplatePatternWebVersion.rar (138,91 kb)

Tags:

ASP.NET

Yorum ekle




  Country flag

biuquote
  • Yorum
  • Canlı önizleme
Loading



Son Yorumlar

Comment RSS

INETA User Group

Yazılım