Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me

Design Pattern - Command



  April 29, 2019    Labels:,,,,,,,, 

Günlük hayatta kullandığımız bir çok cihazın nasıl çalıştığı konusunda bilgi sahibi olmayız. Bize sunulan arayüzleri yani komutları kullanarak cihazlarda istediğimiz işlemleri yapabiliriz. Cihaz üreticilerinin yaptıkları güncellemelerden etkilenmeden cihazları kullanmaya devam edebiliriz. Yazılım sistemlerinde de bir nesne başka bir nesneye işlem yaptıracağı zaman o nesnenin nasıl çalıştığını bilmemelidir. Çünkü eğer bir nesne diğer nesnenin nasıl çalıştığını bilirse aralarında sıkı bağ olur ve bu durum koddaki bağımlılığı arttırır. Bağımlılık ise kodda güncelleme yapmayı zorlaştırır. Bu duruma çözüm getiren kalıp Command Patern'ıdır. Bu patern ile karmaşık işler yapan nesneler kendilerini kullanacak nesnelere arayüzler sağlar. İş yaptıracak nesneler bu arayüzler ile işin nasıl yapıldığını bilmeden o işi yaptırabilirler.
Örneğin ATM cihazlarının nasıl çalıştığını bilmeden ekran ve klavyeyi kullanarak makineye istediğimiz işlemleri yaptırabiliriz. Burada klavye, ekran ve diğer girişler bize sunulan arayüzlerdir.

Uygulama
  • Client command arayüzlerini kullanarak işlemlerini yaptırır.
  • Receiver nesnesine (ATM) arayüzler tarafından işlemler yaptırılır.
  • Invoker nesnesi (Klavye) command arayüzlerini barındırır. Kullanıcıya makineyi kullanması için arayüzler sağlar.




public class ATM{

     public void giris() {
         //işlemler
     }
     
     public void sil() {
         //işlemler
     }
     
     public void onayla() {
         //işlemler
     }
}

public interface Command {
    public void execute();
}

public class GirisCommand implements Command {
    private ATM atm;
    public void execute () {
        atm.giris();
    }
} 

public class SilCommand implements Command {
    private ATM atm;
    public void execute () {
        atm.sil();
    }
}

public class OnaylaCommand implements Command {
    private ATM atm;
    public void execute () {
        atm.onayla();
    }
}

public class Klayve {
    private Command command;
    
    public void setCommand (Command command) {
        this.command = command;
    }
    
    public void tusaBas () {
        command.execute();
    }
}

public class Test {
    public static void main() {
        Klavye klavye = new Klavye();
        Atm atm = new ATM();
        Command girisCommand = new GirisCommand(atm);
        Command silCommand = new SilCommand(atm);
        klavye.setCommand(girisCommand);
        klavye.tusaBas();
        klavye.setCommand(silCommand);
        klavye.tusaBas();
    }
}

No comments:

Post a Comment