C# WinForms ve Mono GTK Silverlight ve WPF Yazılım ve Sistem Güvenliği

Solid Prensipleri 1- Open/Close

Tüm davranışsal patternleri kullandığımız aşağıdaki örneği incelemenizde fayda var. Hata olduğunu düşündüğünüz yer varsa yorumlarda tartışalım.

public partial class MainWindow : Window
    {
        List<dynamic> cocuklar = new List<dynamic>();
        public MainWindow()
        {
            InitializeComponent();

            foreach (var ch in mainGrid.Children) 
                if(ch.GetType()!=typeof(Button)) //Prototype pattern - Alt propertylerden faydalanıyor
                    cocuklar.Add(ch); //Chain of Responsibility pattern - sadece isteğin hakettiği kadar nesneyi seçiyor
        }

        private void Yuvarlak_Click(object sender, RoutedEventArgs e)
        {
            Sekilsec sek = new Sekilsec();

            //Template pattern - Oluşturduğu yapıdaki sınıfa bağlı birden fazla metod çağırıyor.
            //{
            sek.Olustur(cocuklar);
            sek.SekilYap(SekilEnum.yuvarlak);
            //}
        }

        private void Koseli_Click(object sender, RoutedEventArgs e)
        {
            Sekilsec sek = new Sekilsec();
            sek.Olustur(cocuklar); //Visitor pattern - Alt sınıftaki bir metoda işlenmek üzere değişik tipte nesneleri parametre olarak gönderiyor.
            sek.SekilYap(SekilEnum.koseli);
        }

        private void Ucgen_Click(object sender, RoutedEventArgs e)
        {
            Sekilsec sek = new Sekilsec(); //proxy pattern - olayları işleyip geri veriyor
            sek.Olustur(cocuklar);
            sek.SekilYap(SekilEnum.ucgen); //decorator pattern - parametreye göre sınıfın alt benzerlerine kırılım yapıyor
                                           //mediator pattern - Nesnenin yuvarlak mı, koseli mi, ucgen mi olacağı ara yonetici sınıfta belirleniyor
        }
    }

    public enum SekilEnum
    {
        yuvarlak,
        koseli,
        ucgen
    }

    #region parent sınıf oluşturuluyor
    public abstract class Sekil //abstract factory base class
    {
        protected static List<dynamic> sekiller;
        protected Sekil()
        {
            //yapıcı metot isteğe bağlı
        }
        public void Olustur(List<dynamic> shapes)  //Factory method - parent sınıfa injection yapan 
        {
            sekiller = shapes;
            Gizle();
        }
        private void Gizle() //Command pattern - Sınıfta standart işlemleri yapıyor
        {
            sekiller.ForEach(x => {
                x.Visibility = Visibility.Hidden;
            });
        }
        public abstract dynamic SekilYap(SekilEnum? sekil);
    }
    #endregion

    #region miras alan sınıflar oluşturuluyor
    public class Sekilsec : Sekil  //Builder pattern - Enum parametreye göre alt metodlara ayrıştıran 
    {
        //Strategy pattern - Metod parametreye göre nesneyi alt interface veya abstract sınıfa işlem görmek üzere gönderiyor ve gelen cevaba göre kendi içinde işleme devam ediyor.
        public override dynamic SekilYap(SekilEnum? sekil) 
        {
            switch (sekil)
            {
                case SekilEnum.yuvarlak:
                    {
                        YuvarlakSekil ysekil = new YuvarlakSekil();
                        var nesne = (Ellipse)ysekil.SekilYap();
                        nesne.Visibility = Visibility.Visible;
                        break;
                    }
                case SekilEnum.koseli:
                    {
                        KoseliSekil ksekil = new KoseliSekil();
                        var nesne = (Rectangle)ksekil.SekilYap();
                        nesne.Visibility = Visibility.Visible;
                        break;
                    }
                case SekilEnum.ucgen:
                    {
                        UcgenSekil usekil = new UcgenSekil();
                        var nesne = (Path)usekil.SekilYap();
                        nesne.Visibility = Visibility.Visible;
                        break;
                    }
            }
            return null;
        }
    }

    /// <summary>
    /// Ellipse sekli seçer - Observer Pattern
    /// </summary>
    public class YuvarlakSekil : Sekil
    {
        public override dynamic SekilYap(SekilEnum? sekil=null) //Null Object Pattern - Null parametreye karşı metodun bir senaryosu var.
        {
            //Interpreter pattern- Yukarıdan tanımsız gelen nesne burada anlamlı hale geliyor ve bütünün parçasına eklenmek üzere geri gönderiliyor.
            //State pattern - Üst sınıfta durumunu değiştirmek üzere üzere hangi şekli seçtiğini netleştiriyor.
            dynamic result = (Ellipse)sekiller.First(x => x.GetType() == typeof(Ellipse));
            return result;  //Momento Pattern - Anlamı netleşmiş nesnenin bu koşula bağlı son durumu ayarlanıyor ve geri döndürülüyor.
        }
    }
    /// <summary>
    /// Koseli sekli seçer
    /// </summary>
    public class KoseliSekil : Sekil 
    {
        public override dynamic SekilYap(SekilEnum? sekil=null) 
        {
            dynamic result = (Rectangle)sekiller.First(x => x.GetType() == typeof(Rectangle));
            return result;
        }
    }
    /// <summary>
    /// Ucgen sekli seçer
    /// </summary>
    public class UcgenSekil : Sekil
    {
        public override dynamic SekilYap(SekilEnum? sekil=null)
        {
            dynamic result = (Path)sekiller.First(x => x.GetType() == typeof(Path));
            return result;
        }
    }
    #endregion

Bir cevap yazın

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