Swift ile Design Patterns: Decorator

Kaan Yildirim
DigiGeek
Published in
3 min readOct 11, 2021

Herkese merhaba 👋🏻, iyi ve kaliteli kod denilince akla ilk gelen kavramlardan birisi de design patterns’ dir. Türkçesi tasarım desenleri olan bu kavram yazılım dünyasında “design patterns” olarak kalıplaştığı için biz de bu yazı dizisinde design patterns diyeceğiz ve kalıplaşmış hallerini kullanacağız.

Design patterns kısaca yazılım alanında belli sorunlar için yıllarca tecrube edilmiş ve optimum çözüm olarak kabul görmüş, kod bağımsız düşünce yaklaşımıdır. Kod bağımsız olmasından dolayı her yazılım dili için bu yaklaşımların uygulayışı farklıdır. Biz de bu yazımızda decorator design pattern’nin Swift dilindeki uygulamasına bakacağız. Çayınız, kahveniz hazırsa başlayalım. 🏃🏻

Decorator Pattern Nedir?

Objelerimizi modifiye etmeden ekstra özellikler eklemek istediğimizde, decorator objelerine sarmalayarak bu özellikleri kullanabilir hale getirdiğimiz patterndir. Özellikle bir obje için farklı farklı dekorasyona ihtiyaç olduğunda kullanılır. Kullanılması basit olmak ile beraber püf noktası aynı protokolü implement eden bir objenin de sarmalanmasıdır.

Yukarıdaki görselde decorator patternin genel uygulama akışı yer almaktadır. Implementasyonun çıkış noktası Component protokolü. Bu protokol içerisinde objemize katmayı istediğimiz ekstra fonksiyonalite olmalı. Objemiz ve AbstractDecorator bu protokolü implement ediyor. AbstractDecorator içerisinde inner a dikkat çekmek istiyorum burada. AbstractDecorator kendisi zaten bir Component ama içerisinde de dekore edeceği objeyi barındırıyor. ConcreteDecorator larımız da objemize specific özellikler katan objelerimiz.

Swift İmplementasyonu

Şimdi geldi sıra Swift ile decorator pattern kodlamaya. Kapı ve dekoratörler üzerinden bir örnek oluşturalım.

Kodu incelediğimizde, başlangıç notasının Component protokolü olduğunu görmekteyiz. Burada tanımlanmış bir operation fonksiyonu bulunmakta. DoorComponent bizim ana objemiz, bu obje de Component protokolünü implement etmiş. Bu noktada ana objemizi dekore etmek, ona ekstra özellikler katmak için Decorator objemizi implement ediyoruz. İçerisindeki component propertysi decorator patternin bahsettiğimiz püf noktasını oluşturuyor. Decorator ne özellik ekleyecek ise bu objeyi kullanacak. Decorator bu objeyi constructor injection ile alıyor içeriye. Aynı zamanda Decorator objesi de bir Component olduğundan burada da operation metodu bulunmakta ve ana objemizi sarmalamakta.

Pattern ana hatları ile implement edilmiş oldu. Sıra geldi özelliştirilmiş dekoratörleri oluşturmaya. Blue ve Vintage dekoratörlerinin operationlarına baktığımızda bir string döndüğünü ve super metodundan sonra başlarına kendi işlerini eklediklerini görmekteyiz. Böylece içerideki objeyi dekore etmiş oluyoruz.

Decorator patterni kullanma adımını inceleyelim beraber. Client classını component kullanan bir class olarak düşünebiliriz. Bunların hepsini DecoratorConceptual altında birleştireceğiz. Simple adında bir component oluşturuyoruz ve bunu client objesine geçiyoruz. En keyifli kısım şimdi geliyor çünkü simple’ı dekore edeceğiz :) BlueDecorator ve vintageDecorator simple a üst üste yenilik ekleyen objeler. Constructorlarına birbirlerinin çıktısını verdiğimize dikkat edelim burada. En sonda da client üzerindeki fonksiyonu çalıştırarak operationı tetikliyoruz. Print çıktısını da aşağıda bulabilirsiniz ;)

Client: I've got a simple component
Result: Door

Client: Now I've got a decorated component
Result: Vintage(Blue(Door))

Swift ile Design Patterns serimizde bugün Decorator Pattern konusunu işledik ve örneklendirdik. Bir sonraki design pattern bölümünde görüşmek üzere, hoşçakalın. 👨🏻‍💻

Referanslar

--

--