Davranışsal kalıplar, nesneler arası iletişim ve işbirliğini kolaylaştırarak daha dinamik ve esnek yazılım tasarımlarına olanak tanır. Observer, Strategy, Command, State ve Template Method, Java’da yaygın olarak kullanılan davranışsal kalıplardandır. Observer kalıbı, bir nesnenin durumundaki değişikliklerin, bu nesneyi izleyen diğer nesnelere otomatik olarak bildirilmesini sağlar. Bu, olay yönlendirme mekanizmalarında ve kullanıcı arayüzü güncellemelerinde kullanışlıdır.
Observer
Tanım: Bir nesnenin durumundaki değişikliklerin, bu nesneyi izleyen diğer nesnelere otomatik olarak bildirilmesini sağlar. Örnek: Bir sosyal medya platformunda, bir kullanıcının gönderisine yapılan yorumlar, Observer kalıbı kullanılarak, gönderiyi takip eden diğer kullanıcılara gerçek zamanlı olarak bildirilir.
Strategy
Tanım: Bir algoritmanın uygulanışını çalışma zamanında değiştirebilmek için kullanılır. Bu sayede, algoritma davranışları sınıflar arasında kolayca değiştirilebilir. Örnek: Bir e-ticaret uygulamasında, farklı ödeme yöntemleri (kredi kartı, PayPal, kripto para) için Strategy kalıbı kullanılır. Ödeme yöntemi seçimine göre, ilgili ödeme stratejisi nesnesi dinamik olarak seçilir ve kullanılır.
Bu örnekler, Java’da tasarım kalıplarının nasıl kullanılabileceğine dair somut senaryolar sunar. Her bir kalıbın uygulama bağlamında nasıl değerli olabileceğini gösterir ve geliştiricilere, çözümlerini daha modüler, esnek ve yeniden kullanılabilir hale getirmek için ilham verir. Tasarım kalıplarının derinlemesine anlaşılması ve doğru bağlamlarda uygulanması, etkili yazılım tasarımı için kritik öneme sahiptir.
Observer
import java.util.ArrayList;
import java.util.List;
public abstract class Subject {
private List<Observer> observers = new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
public interface Observer {
void update();
}
public class ConcreteSubject extends Subject {
private String state;
public void setState(String state) {
this.state = state;
this.notifyObservers();
}
public String getState() {
return state;
}
}
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update() {
System.out.println(name + " received update");
}
}
// Kullanımı
public class Main {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("Observer 1");
Observer observer2 = new ConcreteObserver("Observer 2");
subject.attach(observer1);
subject.attach(observer2);
subject.setState("New State"); // Her iki observer da güncellenir.
}
}
Strategy
public interface Strategy {
void algorithmInterface();
}
public class ConcreteStrategyA implements Strategy {
@Override
public void algorithmInterface() {
System.out.println("Algorithm A");
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public void algorithmInterface() {
System.out.println("Algorithm B");
}
}
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void contextInterface() {
strategy.algorithmInterface();
}
}
// Kullanımı
public class Main {
public static void main(String[] args) {
Context context = new Context(new ConcreteStrategyA());
context.contextInterface();
context = new Context(new ConcreteStrategyB());
context.contextInterface();
}
}
Bir yanıt yazın