DESIGN PATTERNS (2/3)

Zeynep Türker
HardwareAndro
Published in
3 min readMay 19, 2023

--

Herkese Merhaba, bu yazımda en çok kullanılan structural design patternlardan bahsedeceğim.

Design pattern’ları anlattığım yazı serisinin ilkine aşağıdaki linkten erişebilirsiniz.

STRUCTURAL DESIGN PATTERNS

Adapter Design Pattern

Adapter design pattern, birbiriyle uyumlu olmayan interface’lere sahip nesnelerin birlikte çalışabilmelerini sağlayan structural tasarım desenidir.

Farklı olan sınıfı değiştirmediğimiz için daha önce yazılmış olan kodlarımızı da refactor yapmak zorunda kalmayız.

Adapter design pattern 4 farklı yapıya sahiptir.

  • Target : Farklı olan interface’i dönüştürmek istediğimiz interface’dir.
  • Adaptee : Farklı interface’e sahip sınıfımızdır.
  • Adapter : Farklı olan interface’lerin bir arada çalışmasını sağlayan sınıftır.
  • Client : Target ve Adaptee sınıflarını birlikte kullanmak isteyen sınıftır.

Şimdi bir örnekle devam edelim.

Crypt isimli, encrypt ve decrypt işlemlerimizi yapabilediğimiz bir interface’imiz olsun. Bu sınıf altında CryptA ve CryptB isimli farklı Crypt algoritmalarına sahip olan alt sınıflarımız var.

CodeX de crypt işlemlerini yapan bir sınıf fakat farklı arayüze sahip. Crypt interface’i altında bu işlemi yapmak istediğimiz için de araya Adapter sınıfı yazıyoruz.

Adapter encrypt ve decrypt methodları içinde CodeX’i kullanıyor.
ve bu method içinde constructor’da aldığımız CodeX’in methodlarını kullandık.

Client tarafında Crypt tipinde oluşturduğumuz nesneyi hem CryptA ile hem CryptB ile hem de Adapter aracılığla da CodeX ile atayabilmiş olduk.

public interface Crypt {
void encrypt(String text);

void decrypt(String text);
}
public class CryptA implements Crypt {
@Override
public void encrypt(String text) {
System.out.println(text + " is encrypted with CryptA");
}

@Override
public void decrypt(String text) {
System.out.println(text + " is decrypted with CryptA");
}
}
public class CryptB implements Crypt {
public void encrypt(String text) {
System.out.println(text + " is encrypted with CryptB");
}

public void decrypt(String text) {
System.out.println(text + " is decrypted with CryptB");
}
}
public class CodeX {
public void textToCode(String text) {
System.out.println(text + " is encrypted with CryptX");
}

public void codeToText(String text) {
System.out.println(text + " is decrypted with CryptX");
}
}
public class Adapter implements Crypt {
private final CodeX codeX;

public Adapter(CodeX codeX) {
this.codeX = codeX;
}

public void encrypt(String text) {
codeX.textToCode(text);
}

public void decrypt(String text) {
codeX.codeToText(text);
}
}
public class Demo {
public static void main(String[] args) {
Crypt crypt = new CryptA();
crypt.encrypt("Zeynep");
crypt.decrypt("Çağla");

crypt = new CryptB();
crypt.encrypt("Zeynep");
crypt.decrypt("Çağla");

CodeX codeX = new CodeX();
crypt = new Adapter(codeX);
crypt.encrypt("Zeynep");
crypt.decrypt("Çağla");
}
}

Facade Design Pattern

Facade, birden fazla sınıfı tek bir yapı altında toplayarak kullanmamızı sağlayan tasarım desenidir.

Yani biz Facade sınıfının bir methodunu kullandığımızda arka tarafında yapılan işleri bilmek zorunda değiliz. Örnek vericek olursak;
Bilgisayarı açtığımızda arka tarafta yapılan CPU’nun çalışması, Ram’in okunması gibi işlerden kullanıcı haberdar olmaz.

Şimdi bu örneği kodlayalım.

public class RAM {
public void load() {
System.out.println("RAM is loaded");
}
}
public class CPU {
public void run() {
System.out.println("CPU is running");
}
}
public class HDD {
public void read() {
System.out.println("HDD is read");
}
}
public class Computer {
private final CPU cpu;
private final RAM ram;
private final HDD hdd;

public Computer() {
cpu = new CPU();
ram = new RAM();
hdd = new HDD();
}

public void start() {
cpu.run();
ram.load();
hdd.read();
System.out.println("Computer is started");
}

public void shutdown() {
System.out.println("Computer is shutting down");
}
}

CPU sınıfında CPU’yu çalıştıracak bir method, RAM sınıfında RAM’i yükleyecek bir method, HDD sınıfında da HDD’nin okunabildiği bir methodumuzun olduğu varsayalım.

Computer sınıfında Cpu, Ram ve Hdd sınıflarının nesneleri oluşturuldu ve bu nesneler Computer methodlarında kullanıldı.
Client tarafında Computer nesnesi oluşturulup start methodu çağırıldığında Client arka tarafta yapılmış olan işlemleri bilmez. Sadece kullanması gereken methodun imzasını yani ismini, return değerini, parametrelerini vs. bilir.

Facade design pattern sayesinde yapılacak işin karmaşıklığı Client’dan saklanılarak daha basit bir arayüz kullanıcıya verilir.

Umarım faydalı olmuştur.

Bu yazının devamında en çok kullanılan behavioral design patternlardan bahsettim. Bu yazıya da bakabilirsiniz.

--

--