design patterns etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
design patterns etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Bana Command design pattern'ini bir aptala anlatır gibi Java ile anlatır mısın?



Elbette, Command tasarım desenini basitçe açıklayalım ve Java örneğiyle destekleyelim:


Command Tasarım Deseni Nedir?

Command deseni, bir isteği (komutu) bir nesne olarak kapsüller. Bu, istemcilerin farklı istekleri, kuyrukları veya günlükleri parametre olarak göndermesine ve ayrıca geri alınabilir işlemleri desteklemesine olanak tanır.


Neden Kullanılır?

İşlemleri ve onları çağıran nesneleri ayırmak istediğinizde.

İşlem sırasını veya günlüğünü tutmak istediğinizde.

Geri alınabilir işlemler yapmak istediğinizde.

Basit Bir Java Örneği:

Command Arayüzü: Tüm komutların uygulayacağı bir arayüz.


java

Copy code

public interface Command {

    void execute();

}

Concrete Command: Gerçekleştirmek istediğiniz işlem.


java

Copy code

public class LightOnCommand implements Command {

    private Light light;


    public LightOnCommand(Light light) {

        this.light = light;

    }


    public void execute() {

        light.on();

    }

}

Receiver: Komutun gerçekleştirileceği nesne.


java

Copy code

public class Light {

    public void on() {

        System.out.println("Işık açık!");

    }


    public void off() {

        System.out.println("Işık kapalı!");

    }

}

Invoker: Komutu çağıran ve ne zaman uygulanacağını belirleyen nesne.


java

Copy code

public class RemoteControl {

    private Command command;


    public void setCommand(Command command) {

        this.command = command;

    }


    public void pressButton() {

        command.execute();

    }

}

Client: Uygulama.


java

Copy code

public class CommandPatternDemo {

    public static void main(String[] args) {

        Light light = new Light();

        Command lightOn = new LightOnCommand(light);

        RemoteControl control = new RemoteControl();

        control.setCommand(lightOn);

        control.pressButton();

    }

}

Nasıl Çalışır?

CommandPatternDemo (istemci), bir Light (receiver) nesnesi oluşturur.

LightOnCommand (concrete command) nesnesi, Light nesnesini alır.

RemoteControl (invoker), komutu alır ve tetiklendiğinde execute metodunu çağırır.

Bu, Light nesnesindeki on metodunun çağrılmasına neden olur ve "Işık açık!" mesajı yazdırılır.

Bu örnek, Command deseninin temel yapısını ve nasıl kullanılacağını gösterir. Gerçek dünya uygulamalarında, bu desen daha karmaşık senaryolar için genişletilebilir.


Bana başka basit bir senaryo daha verir misin? Bu deseni uygulayalarak ne gibi avantajlar sağlarız?


Tabii ki, başka bir basit senaryo verebilirim ve Command deseninin sağladığı avantajlardan bahsedebilirim.


Basit Senaryo: Müzik Çalar Kontrolü

Bu senaryoda, bir müzik çaların temel fonksiyonlarını (çalmak, durdurmak) kontrol eden bir uygulama düşünün.


Command Arayüzü:


java

Copy code

public interface Command {

    void execute();

}

Concrete Commands:


Müziği Çalmak için:

java

Copy code

public class PlayMusicCommand implements Command {

    private MusicPlayer musicPlayer;


    public PlayMusicCommand(MusicPlayer musicPlayer) {

        this.musicPlayer = musicPlayer;

    }


    @Override

    public void execute() {

        musicPlayer.play();

    }

}

Müziği Durdurmak için:

java

Copy code

public class StopMusicCommand implements Command {

    private MusicPlayer musicPlayer;


    public StopMusicCommand(MusicPlayer musicPlayer) {

        this.musicPlayer = musicPlayer;

    }


    @Override

    public void execute() {

        musicPlayer.stop();

    }

}

Receiver (Müzik Çalar):


java

Copy code

public class MusicPlayer {

    public void play() {

        System.out.println("Müzik çalıyor...");

    }


    public void stop() {

        System.out.println("Müzik durduruldu.");

    }

}

Invoker (Uzaktan Kumanda):


java

Copy code

public class RemoteControl {

    private Command command;


    public void setCommand(Command command) {

        this.command = command;

    }


    public void pressButton() {

        command.execute();

    }

}

Client (Uygulama):


java

Copy code

public class MusicPlayerDemo {

    public static void main(String[] args) {

        MusicPlayer player = new MusicPlayer();

        Command play = new PlayMusicCommand(player);

        Command stop = new StopMusicCommand(player);


        RemoteControl remote = new RemoteControl();

        remote.setCommand(play);

        remote.pressButton(); // Müzik çalıyor...


        remote.setCommand(stop);

        remote.pressButton(); // Müzik durduruldu.

    }

}

Command Deseninin Avantajları

Soyutlama ve Esneklik: İşlemler, komut nesneleri aracılığıyla soyutlanır. Bu, farklı komutları değiştirebilir, ekleyebilir veya çıkarabilirsiniz, kodun geri kalan kısmına etki etmeden.


Düşük Bağlantılılık (Coupling): İşlemleri gerçekleştiren nesneler ile bu işlemleri çağıran nesneler arasında sıkı bir bağlantı yoktur. Bu, uygulamanın bakımını ve genişletilmesini kolaylaştırır.


Geri Alma / İptal İşlemleri: Komutların geri alınması veya iptal edilmesi işlevselliği kolayca ekleyebilirsiniz. Örneğin, bir "Undo" komutu uygulayarak en son gerçekleştirilen işlemi geri alabilirsiniz.


Komutların Kaydedilmesi ve Yeniden Çalıştırılması: Komutları kaydedip daha sonra tekrar çalıştırabilirsiniz. Bu, özellikle makro kaydı gibi özellikler için kullanışlıdır.


Geliştirilebilirlik: Yeni komutlar eklemek kolaydır ve mevcut kodu değiştirmenize gerek yoktur. Bu, yazılımın genişletilebilirliğini artırır.


Bu senaryo ve avantajlar, Command deseninin neden popüler ve güçlü bir tasarım deseni olduğunu göstermektedir. Özellikle kullanıcı arayüzleri, işlem kuyrukları, ve geri alınabilir işlemler gibi alanlarda oldukça etkilidir.


Son örnek için undo örneği verir misin?


Elbette, müzik çalar senaryosuna bir "geri al" (undo) özelliği ekleyerek Command desenini nasıl genişletebileceğimizi gösterebilirim. Bu örnekte, her komutun son eylemini geri alacak bir mekanizma ekleyeceğim.


Geliştirilmiş Command Arayüzü

Öncelikle Command arayüzüne bir undo metodunu ekleyelim:


java

Copy code

public interface Command {

    void execute();

    void undo();

}

Concrete Commands'ın Güncellenmesi

Her komut için, execute metoduna ek olarak bir undo metodu ekleyin. Örneğin, PlayMusicCommand ve StopMusicCommand için:


java

Copy code

public class PlayMusicCommand implements Command {

    private MusicPlayer musicPlayer;


    public PlayMusicCommand(MusicPlayer musicPlayer) {

        this.musicPlayer = musicPlayer;

    }


    @Override

    public void execute() {

        musicPlayer.play();

    }


    @Override

    public void undo() {

        musicPlayer.stop();

    }

}


public class StopMusicCommand implements Command {

    private MusicPlayer musicPlayer;


    public StopMusicCommand(MusicPlayer musicPlayer) {

        this.musicPlayer = musicPlayer;

    }


    @Override

    public void execute() {

        musicPlayer.stop();

    }


    @Override

    public void undo() {

        musicPlayer.play();

    }

}

Invoker'da Değişiklikler

RemoteControl sınıfında, en son çalıştırılan komutu saklayıp, undo fonksiyonunu çağıracak şekilde güncelleyelim:


java

Copy code

public class RemoteControl {

    private Command command;

    private Command lastCommand;


    public void setCommand(Command command) {

        this.command = command;

    }


    public void pressButton() {

        command.execute();

        lastCommand = command;

    }


    public void pressUndo() {

        if (lastCommand != null) {

            lastCommand.undo();

        }

    }

}

Client (Uygulama)

Müzik çalar örneğinde, komutları çalıştırın ve ardından geri alın:


java

Copy code

public class MusicPlayerDemo {

    public static void main(String[] args) {

        MusicPlayer player = new MusicPlayer();

        Command play = new PlayMusicCommand(player);

        Command stop = new StopMusicCommand(player);


        RemoteControl remote = new RemoteControl();


        // Müziği Çal

        remote.setCommand(play);

        remote.pressButton(); // Müzik çalıyor...


        // Geri Al (Müziği Durdur)

        remote.pressUndo(); // Müzik durduruldu.


        // Müziği Durdur

        remote.setCommand(stop);

        remote.pressButton(); // Müzik durduruldu.


        // Geri Al (Müziği Çal)

        remote.pressUndo(); // Müzik çalıyor...

    }

}

Nasıl Çalışır?

İstemci (MusicPlayerDemo), PlayMusicCommand ve StopMusicCommand komutlarını kullanarak müzik çaları kontrol eder.

RemoteControl üzerinde bir butona basıldığında (pressButton), belirlenen komut (play veya stop) çalıştırılır ve son komut olarak saklanır.

pressUndo çağrıldığında, en son komutun undo metodu çalıştırılır, böylece son yapılan işlem geri alınır.

Bu örnek, Command deseninin geri alma (undo) işlevselliğini nasıl kolayca destekleyebileceğini gösterir. Bu, kullanıcı hatalarını düzeltmek veya esnek bir kullanıcı deneyimi sağlamak için uygulamalarda sıklıkla kullanılır.

Bana Chain Of Responsibility patterni Java ile bir aptala anlatır gibi anlatır mısın?

 Chain of Responsibility desenini Java'da adım adım anlatayım ve örnek bir kod parçası ile açıklayayım.





Chain of Responsibility Deseninin Temel Fikri:

Chain of Responsibility, bir isteği (request) işlemek için bir nesneler zinciri oluşturur. İstek zincirdeki ilk nesneden başlar ve her nesne ya isteği işler ya da bir sonraki nesneye aktarır. Bu, isteğin hangi nesne tarafından işleneceğinin önceden belirlenmemiş olmasını sağlar.


Örnek Senaryo:

Diyelim ki bir uygulamada farklı türlerdeki log mesajlarını (hata, uyarı, bilgi) işlemek istiyorsunuz. Her bir mesaj türü için farklı bir işleyici (handler) tanımlayacaksınız ve bu işleyiciler bir zincir oluşturacak.


Handler Arayüzü Oluşturma:


Handler adında bir arayüz tanımlayın. Bu arayüzde, isteği işlemek için handleRequest ve bir sonraki handler'ı ayarlamak için setNext adında iki metot olmalıdır.

Konkret Handler Sınıfları Oluşturma:


ErrorHandler, WarningHandler, InfoHandler adında Handler arayüzünü uygulayan sınıflar oluşturun. Her biri, kendisine verilen mesajı işleyecek ve uygunsa bir sonraki handler'a aktaracak.

Zinciri Kurma:


Bu handler'ları bir zincirde sıralayın. Örneğin, ErrorHandler'ı ilk sıraya, sonra WarningHandler'ı ve en sona InfoHandler'ı koyun.

Java ile Uygulama:

İşte bu tasarım deseninin basit bir uygulaması:


java

Copy code

interface Handler {

    void setNext(Handler handler);

    void handleRequest(String message);

}


class ErrorHandler implements Handler {

    private Handler next;


    @Override

    public void setNext(Handler handler) {

        this.next = handler;

    }


    @Override

    public void handleRequest(String message) {

        if (message.contains("Error")) {

            System.out.println("Error Handler: " + message);

        }

        if (next != null) {

            next.handleRequest(message);

        }

    }

}


class WarningHandler implements Handler {

    private Handler next;


    @Override

    public void setNext(Handler handler) {

        this.next = handler;

    }


    @Override

    public void handleRequest(String message) {

        if (message.contains("Warning")) {

            System.out.println("Warning Handler: " + message);

        }

        if (next != null) {

            next.handleRequest(message);

        }

    }

}


class InfoHandler implements Handler {

    private Handler next;


    @Override

    public void setNext(Handler handler) {

        this.next = handler;

    }


    @Override

    public void handleRequest(String message) {

        if (message.contains("Info")) {

            System.out.println("Info Handler: " + message);

        }

        if (next != null) {

            next.handleRequest(message);

        }

    }

}


public class Client {

    public static void main(String[] args) {

        Handler errorHandler = new ErrorHandler();

        Handler warningHandler = new WarningHandler();

        Handler infoHandler = new InfoHandler();


        errorHandler.setNext(warningHandler);

        warningHandler.setNext(infoHandler);


        errorHandler.handleRequest("Error: Bu bir hata mesajıdır.");

        errorHandler.handleRequest("Warning: Bu bir uyarı mesajıdır.");

        errorHandler.handleRequest("Info: Bu bir bilgi mesajıdır.");

    }

}

Bu kodda, ErrorHandler, WarningHandler ve InfoHandler sınıfları belirli türdeki mesajları işler ve gerektiğinde zincirdeki bir sonraki handler'a mesajı aktarır. Client sınıfı ise zinciri kurar ve test mesajlarını gönderir.

Bana template design pattern'i Java ile bir aptala anlatır gibi anlatır mısın?



Tabii ki, Template Design Pattern (Şablon Tasarım Deseni) basitçe anlatmak gerekirse bir algoritmanın yapısını bir üst sınıfta tanımlayıp, bazı adımlarını alt sınıflarda uygulamak veya değiştirmek için kullanılır. Java'da bu, genellikle soyut bir sınıf ve ondan türeyen bir veya daha fazla somut sınıf kullanarak gerçekleştirilir.


Şablon Tasarım Deseni Nasıl Çalışır?

Soyut Sınıf Oluşturulur: Bu sınıf, algoritmanın iskeletini temsil eden bir veya daha fazla soyut metot içerir. Bu metotlar, alt sınıflar tarafından uygulanacak olan adımlardır.


Somut Sınıflar Oluşturulur: Bu sınıflar, soyut sınıftan türetilir ve soyut metotları gerçekleştirir. Farklı somut sınıflar, algoritmanın adımlarını farklı şekillerde uygulayabilir.


Algoritmanın İskeleti Çalıştırılır: Soyut sınıftaki metotlar, algoritmanın genel yapısını oluşturur ve bu sınıftan türetilen sınıfların sağladığı özel adımları çağırır.


Örnek Java Kodu

java

Copy code

// Soyut Sınıf

abstract class Game {

    // Algoritmanın iskeleti

    final void playGame() {

        initialize();

        startPlay();

        endPlay();

    }


    // Soyut metotlar

    abstract void initialize();

    abstract void startPlay();

    abstract void endPlay();

}


// Somut Sınıf 1

class Cricket extends Game {

    void initialize() {

        System.out.println("Cricket Game Initialized!");

    }


    void startPlay() {

        System.out.println("Cricket Game Started. Enjoy the game!");

    }


    void endPlay() {

        System.out.println("Cricket Game Finished!");

    }

}


// Somut Sınıf 2

class Football extends Game {

    void initialize() {

        System.out.println("Football Game Initialized!");

    }


    void startPlay() {

        System.out.println("Football Game Started. Enjoy the game!");

    }


    void endPlay() {

        System.out.println("Football Game Finished!");

    }

}


// Main sınıf

public class Main {

    public static void main(String[] args) {

        Game game = new Cricket();

        game.playGame();


        game = new Football();

        game.playGame();

    }

}

Bu örnekte, Game soyut sınıfı, bir oyunun nasıl oynanacağını tanımlayan playGame() metodunu içerir. Bu metot, oyunun başlatılmasını (initialize()), oynanmasını (startPlay()) ve bitirilmesini (endPlay()) yönetir. Cricket ve Football sınıfları, bu adımları kendi içlerinde nasıl gerçekleştireceklerini tanımlar. Böylece, Game sınıfının iskeleti aynı kalırken, oyunun gerçekleştirilme şekli alt sınıflara göre değişir.

(GRASP) Genel Sorumluluk Atama Yazılım Kalıpları (veya Prensipleri), Wikipedia Çevirisi

Merhaba, bu yazımda sizlere bilgisayar bilimcisi Craig Larman tarafından Applying UML and Patterns kitabında yayınladığı GRASP prensiplerinin Wikipedia'da yayınlanan halinin Türkçe çevirisini yapacağım. Umarım faydalı bir yazı olur.



GRASP(General Responsibility Assignment Software Patterns (or Principles))

Genel Sorumluluk Atama Yazılım Kalıpları (veya Prensipleri), kısaltılmış haliyle GRSAP, nesneye yönelik tasarımdaki sınıflara ve nesnelere sorumluluk atamak için kurallardan oluşur. SOLID tasarım prensibi ile ilgili değildir.

GRASP'ta kullanılan farklı pattern ve prensipler controller, creator, indirection, information expert, high cohesion, low coupling, polymorphism, protected variations, ve pure fabrication'dır. Tüm bu modeller bazı yazılım problemlerini cevaplar ve bu problemler hemen hemen her yazılım geliştirme projesinde ortaktır. Bu teknikler yeni çalışma yolları yaratmak için değil, nesne yönelimli tasarımda eski, denenmiş ve test edilmiş programlama ilkelerini daha iyi belgelemek ve standartlaştırmak için icat edilmiştir.

Bilgisayar bilimcisi Craig Larman, "yazılım geliştirme için kritik tasarım aracının tasarım ilkeleri konusunda iyi eğitimli bir zihin olduğunu, UML veya başka bir teknoloji olmadığını" belirtiyor. Böylece, GRASP gerçekten zihinsel bir araç seti, nesne yönelimli yazılımın tasarımında yardımcı olacak bir öğrenme yardımcısıdır.

PATTERNS
(Yazılım Desenleri)

OO tasarımında, yazılım deseni, yeni bağlamlarda uygulanabilecek bir sorunun ve çözümün adlandırılmış bir tanımıdır; ideal olarak bir yazılım deseni, çözümünün değişen koşullarda nasıl uygulanacağı konusunda tavsiyede bulunur ve engelleri ve değişimleri dikkate alır. Belirli bir sorun kategorisi verilen birçok desen, nesnelere sorumlulukların atanmasına rehberlik eder.

Controller
(Denetleyici)

Controller pattern, genel sistemi veya bir kullanım senaryosunu temsil eden UI olmayan bir sınıfa sistem olaylarıyla ilgilenme sorumluluğunu atar. Controller nesnesi, bir sistem olayını almak veya işlemekten sorumlu olan kullanıcısız bir arabirim nesnesidir.

Bir kullanım senaryosunun tüm sistem olaylarıyla ilgilenmek için bir veya birden fazla kullanım senaryosu controller'ı kullanılmalıdır. Örneğin, Kullanıcı Yarat ve Kullanıcıyı Sil gibi durumlarda, iki ayrı kullanım senaryosu denetleyicisi yerine UserController adlı tek bir sınıf bulunabilir.

Controller, bir UI katmanının gerisinde bir sistem olayını alan ve koordine eden ("kontrol eden") ilk nesne olarak tanımlanır. Controller, yapılması gereken işi başka nesnelere devretmelidir; etkinliği koordine eder veya kontrol eder. Çok fazla iş yapmamalıdır.  GRASP Controller'ın , bir bilgi sistemi mantıksal mimarisinde ortak katmanları olan nesne yönelimli bir sistemdeki uygulama / hizmet katmanının (uygulamanın uygulama / hizmet katmanı ve etki alanı katmanı arasında açık bir ayrım yaptığını varsayarak) bir parçası olduğu düşünülebilir.


Creator
(Yaratıcı)

Ayrıca bakınız: Factory Pattern

Nesnelerin oluşturulması, nesne yönelimli bir sistemdeki en yaygın etkinliklerden biridir. Hangi sınıfın nesnelerin yaratılmasından sorumlu olduğu, belirli sınıfların nesneleri arasındaki ilişkinin temel bir özelliğidir.

Genel olarak, B sınıfı aşağıdakilerden biri veya tercihen daha fazlası geçerli olduğunda A sınıfı örnekleri oluşturmaktan sorumlu olmalıdır:

-B'nin nesneleri , A nesnelerini içerir ya da bir araya getirir.
-B'nin nesneleri, A'nın nesnelerini kaydeder
-B'nin nesneleri, A nesnelerini yakından kullanır.
-B nesneleri, A nesneleri için başlangıç bilgisine sahiptir ve onu yaratıma aktarır.


Indirection
(Dolaylı)

Indirection pattern, ara elemanlara arabuluculuk sorumluluğunu atayarak iki eleman arasındaki düşük bağlantı ve yeniden kullanım potansiyelini destekler. Buna bir örnek MVC pattern'ında veriler(model) ile verilerin gösterimin sağlayan(view) arasında aracılık yapan controllerlar'dır. Bu, aralarındaki bağların düşük kalmasını sağlar.


Information Expert
(Bilgi Uzmanı)

Ayrıca bakınız: Information Hiding

Information Expert (aynı zamanda uzman ya da uzman ilkesi), metodlar, hesaplanan field'lar vb. Gibi sorumlulukların nereye delege edileceğini belirlemek için kullanılan bir ilkedir.

Information Expert prensibini kullanarak, sorumlulukların atanmasına yönelik genel bir yaklaşım, verilen bir sorumluluğa bakmak, yerine getirmek için gerekli bilgileri belirlemek ve daha sonra bu bilgilerin nerede saklandığını belirlemektir.

Bu, sorumluluğu yerine getirmek için gereken en fazla bilgi ile ilgili sınıfa yerleştirmeyi sağlayacaktır.

High Cohession
(Yüksek Uyum)

Yüksek uyum, nesneleri uygun şekilde odaklanmış, yönetilebilir ve anlaşılır tutmaya çalışan bir değerlendirme örüntüsüdür. Yüksek kohezyon genellikle düşük bağlantıyı desteklemek için kullanılır. Yüksek uyum, belirli bir öğenin sorumluluklarının güçlü bir şekilde ilişkili ve yüksek derecede odaklanmış olduğu anlamına gelir. Programları sınıflara ve alt sistemlere bölmek, sistemin tutarlı özelliklerini artıran etkinliklere bir örnektir. Alternatif olarak, düşük uyum, belirli bir elementin çok fazla ilgisiz sorumluluğa sahip olduğu bir durumdur. Düşük kohezyona sahip elementler genellikle kavranması, tekrar kullanılması, bakımı ve değiştirilmesi zor olmaktan muzdariptir.

Low coupling

(Düşük Bağlantı)

Coupling, bir elemanın diğer elemanlara ne kadar güçlü bir şekilde bağlandığını, bilgisine sahip olduğunu veya bunlara dayandığını gösterir. Düşük bağlantı, aşağıdaki faydalar için sorumlulukların nasıl atanacağını belirleyen bir değerlendirme modelidir:

sınıflar arasında daha düşük bağımlılık,
bir sınıfta diğer sınıflar üzerinde daha az etkisi olan değişim,
daha yüksek yeniden kullanım potansiyeli.

Polymorphism
Ayrıca Bakınız : Nesneye yönelik programlamada polimorfizm

Polimorfizm ilkesine göre, davranışa göre davranış çeşitliliğini tanımlama sorumluluğu bu değişimin gerçekleştiği alt türe verilir. Bu, polimorfik işlemler kullanılarak elde edilir. Türün kullanıcısı, türe dayalı dallanmalar yerine polimorfik işlemleri kullanmalıdır.

Protected variations
(Korumalı Varyasyonlar)

Korumalı varyasyon modeli, kararsızlığın odağını bir arayüzle sararak ve bu arayüzün çeşitli uygulamalarını oluşturmak için polimorfizm kullanarak elemanları diğer elemanlardaki (nesneler, sistemler, alt sistemler) varyasyonlardan korur.

Pure Fabrication

Bir pure fabrication sınıfı, özellikle düşük bağlantı, yüksek uyum ve türetilmiş yeniden kullanım potansiyeline (bilgi uzmanı modeli tarafından sunulan bir çözüm sunmadığında) ulaşmak için özel olarak oluşturulmuş, problem alanında bir kavramı temsil etmeyen bir sınıftır. Bu tür sınıfa, domain driven design'da  "service" adı verilir.




Facade (Cephe) Design Pattern

TDK'ya göre cephe : Bir şeyin veya yapının ön tarafta bulunan bölümü Facade design pattern alt sistemlerden oluşmuş bir sistemde kullanıcının (client)'ın bu alt sistemleri bilmeden herbirini yalnız başına veya ortak olarak kullanabileceği arayüzü sağlar. Bir örnekle açıklayalım. Bir bilgisayar ram, hdd, cpu gibi alt sistemlerden oluşur. Bir bilgisayarı başlattığımız zaman bu alt sistemleri harekete geçirirp belli işlemleri yerine getirmesini bekleriz. Fakat kullanıcı bu alt sistemleri tek tek harekete geçirmek yerine kasada var olan start tuşuyla bu alt sistemlerin sırasıyla hepsinin harekete geçmesini bekler. Client bunların sırasını ve neler yaptığını pek bilmek istemez. Burada kasa'ya facade sınıfı diyebiliriz. Kod olarak gösterecek olursak.




/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}
Alt sistemler kendi başlarına sırayla çalışabildiği gibi, birbirleri ile etkileşim halinde olup belli işleri yerine de getirebilirler.

Rastgele İçerik

DonanımHaber

© tüm hakları saklıdır
made with by templateszoo