Java Tasarım Desenleri : Chain Of Responsebility Pattern
Chain of Responsibility Pattern
Java Tasarım Desenleri dersine hoşgeldiniz. Chain of Responsibility Pattern ile ilgili derse aşağıdaki adresten ulaşabilirsiniz.
Chain of Responsibility Pattern, davranışsal bir tasarım desenidir ve bir isteği işlemek için bir dizi nesne arasında bir zincir oluşturur. Bu desen, isteği işleyebilecek bir nesne bulana kadar istek zincirindeki nesneleri dolaşır.
Temel Bileşenler
- Handler (İşleyici): Bu, isteği işleyen soyut bir sınıftır ve zincirdeki nesneler arasında bir sonraki işleyiciyi tanımlar.
- Concrete Handlers (Somut İşleyiciler): Bu, isteği işleyen somut işleyicilerdir. Her biri belirli bir isteği işlemek için sorumludur ve işlemi başarıyla tamamladığında zinciri durdurabilir veya bir sonraki işleyiciye devam edebilir.
- Client (İstemci): Bu, bir isteği zincirdeki başlangıç noktasına ileten ve zincirin sonucunu alacak olan nesnedir.
Amaç
Chain of Responsibility Pattern’in amacı, bir isteği işlemek için bir dizi nesne arasında bir zincir oluşturarak isteği işleme sürecini esnek hale getirmektir. Bu sayede, isteği işleyecek nesne bulunana kadar zincirdeki nesneler arasında dolaşılabilir.
Avantajlar
- Esneklik: Chain of Responsibility Pattern, işlemi zincirdeki herhangi bir noktada değiştirmenizi sağlar, bu da kodun daha esnek olmasını sağlar.
- Modülerlik: Zincirdeki her bir işleyici, belirli bir işlemi gerçekleştirir, bu da kodun daha modüler olmasını sağlar.
- İşlem Sırasının Değiştirilebilirliği: Zincirdeki işleyicilerin sırasını veya sayısını değiştirmek, işlemin nasıl işlendiğini etkiler, bu da kodun daha dinamik olmasını sağlar.
Chain of Responsibility Pattern, bir isteği işlemek için bir dizi nesne arasında bir zincir oluşturarak kodun daha esnek, modüler ve dinamik olmasını sağlar.
Kod Örneği
public abstract class Middleware {
private Middleware next;
public Middleware linkWith(Middleware next) {
this.next = next;
return this;
}
public abstract boolean check(String email, String password);
protected boolean checkNext(String email, String password) {
if (next == null) {
return true;
}
return next.check(email, password);
}
}
public class RoleCheckMiddleware extends Middleware {
public boolean check(String email, String password) {
if (email.equals("admin@example.com")) {
System.out.println("Hello, admin!");
return true;
}
System.out.println("Hello, user!");
return checkNext(email, password);
}
}
public class ThrottlingMiddleware extends Middleware{
private int requestPerMinute;
private int request;
private long currentTime;
public ThrottlingMiddleware(int requestPerMinute) {
this.requestPerMinute = requestPerMinute;
this.currentTime = System.currentTimeMillis();
}
public boolean check(String email, String password) {
if (System.currentTimeMillis() > currentTime + 60_000) {
request = 0;
currentTime = System.currentTimeMillis();
}
request++;
if (request > requestPerMinute) {
System.out.println("Request limit exceeded!");
Thread.currentThread().stop();
}
return checkNext(email, password);
}
}
public class UserExistsMiddleware extends Middleware {
private Server server;
public UserExistsMiddleware(Server server) {
this.server = server;
}
public boolean check(String email, String password) {
if (!server.hasEmail(email)) {
System.out.println("This email is not registered!");
return false;
}
if (!server.isValidPassword(email, password)) {
System.out.println("Wrong password!");
return false;
}
return checkNext(email, password);
}
}
public class Server {
private Map<String, String> users = new HashMap<>();
private Middleware middleware;
public void setMiddleware(Middleware middleware) {
this.middleware = middleware;
}
public boolean logIn(String email, String password) {
if (middleware.check(email, password)) {
System.out.println("Authorization have been successful!");
// Do something useful here for authorized users.
return true;
}
return false;
}
public void register(String email, String password) {
users.put(email, password);
}
public boolean hasEmail(String email) {
return users.containsKey(email);
}
public boolean isValidPassword(String email, String password) {
return users.get(email).equals(password);
}
}
public class Main {
private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
private static Server server;
private static void init() {
server = new Server();
server.register("admin@example.com", "admin_pass");
server.register("user@example.com", "user_pass");
Middleware userExistsMiddleware = new UserExistsMiddleware(server);
Middleware roleCheckMiddleware = new RoleCheckMiddleware();
Middleware middleware = new ThrottlingMiddleware(2);
middleware.linkWith(userExistsMiddleware.linkWith(roleCheckMiddleware));
server.setMiddleware(middleware);
}
public static void main(String[] args) throws IOException {
init();
boolean success;
do {
System.out.print("Enter email: ");
String email = reader.readLine();
System.out.print("Input password: ");
String password = reader.readLine();
success = server.logIn(email, password);
} while (!success);
}
}




