CodeGym /Java Blogu /Rastgele /Adaptör tasarım deseni
John Squirrels
Seviye
San Francisco

Adaptör tasarım deseni

grupta yayınlandı
MERHABA! Bugün önemli bir yeni konuya değineceğiz: tasarım kalıpları . Bu modeller nelerdir? Sanırım " tekerleği yeniden icat etme " ifadesini biliyor olmalısınız. Diğer birçok alanda olduğu gibi programlamada da çok sayıda ortak durum vardır. Yazılım geliştirme geliştikçe, her biri için çalışan hazır çözümler yaratıldı. Bu çözümlere tasarım modelleri denir. Geleneksel olarak, bir model şu şekilde formüle edilmiş bir çözümdür: "eğer programınızda X yapmanız gerekiyorsa, bunu yapmanın en iyi yolu budur". Pek çok desen var. Kesinlikle aşina olmanız gereken mükemmel kitap "Head First Design Patterns" onlara adanmıştır. Adaptör tasarım deseni - 2Kısaca, bir model, ortak bir sorundan ve bir tür standart olarak kabul edilebilecek karşılık gelen bir çözümden oluşur. Bugünün dersinde şu kalıplardan biriyle karşılaşacağız: Bağdaştırıcı. Adı her şeyi söylüyor ve gerçek hayatta birçok kez adaptörlerle karşılaştınız. En yaygın bağdaştırıcılardan bazıları, birçok bilgisayar ve dizüstü bilgisayarın sahip olduğu kart okuyuculardır. Adaptör tasarım deseni - 3Bir çeşit hafıza kartımız olduğunu varsayalım. Öyleyse sorun nedir? Bilgisayarla nasıl etkileşim kuracağını bilmiyor. Ortak bir arayüzü paylaşmazlar. Bilgisayarda bir USB bağlantı noktası var, ancak hafıza kartını oraya takamıyoruz. Kart bilgisayara takılamıyor, dolayısıyla fotoğraflarımızı, videolarımızı ve diğer verilerimizi kaydedemiyoruz. Kart okuyucu, bu sorunu çözen bir adaptördür. Sonuçta, bir USB kablosu var! Kartın kendisinden farklı olarak, kart okuyucu bilgisayara takılabilir. Bilgisayarla ortak bir arayüzü paylaşırlar: USB. Bunun pratikte nasıl göründüğüne bakalım:

public interface USB { 

   void connectWithUsbCable(); 
}
Bu, USB yoluyla bağlanmak için tek bir yöntemle USB arabirimimizdir.

public class MemoryCard { 

   public void insert() { 
       System.out.println("Memory card successfully inserted!"); 
   } 

   public void copyData() { 
       System.out.println("The data has been copied to the computer!"); 
   } 
}
Bu hafıza kartını temsil eden sınıfımızdır. Halihazırda ihtiyacımız olan 2 yönteme sahip, ancak sorun şu: USB arayüzünü uygulamıyor. Kart, USB bağlantı noktasına takılamaz.

public class CardReader implements USB { 

   private MemoryCard memoryCard; 

   public CardReader(MemoryCard memoryCard) { 
       this.memoryCard = memoryCard; 
   } 

   @Override 
   public void connectWithUsbCable() { 
       this.memoryCard.insert(); 
       this.memoryCard.copyData(); 
   } 
}
Ve işte adaptörümüz! Ne yaparCardReaderclass do ve tam olarak onu bir adaptör yapan nedir? Her şey basit. Uyarlanan sınıf (MemoryCard), bağdaştırıcının alanlarından biri haline gelir. Bu mantıklı. Gerçek hayatta hafıza kartını kart okuyucunun içine koyduğumuzda o da onun bir parçası oluyor. Hafıza kartından farklı olarak, adaptör bilgisayarla aynı arabirimi paylaşır. Bir USB kablosu vardır, yani USB üzerinden diğer cihazlara bağlanabilir. Bu nedenle CardReader sınıfımız USB arayüzünü uygular. Ancak bu yöntemin içinde tam olarak ne olur? Tam olarak olması gereken şey! Adaptör, işi hafıza kartımıza devreder. Aslında, bağdaştırıcı kendi başına bir şey yapmaz. Bir kart okuyucunun herhangi bir bağımsız işlevi yoktur. Görevi, kartın işini yapmasına izin vermek için yalnızca bilgisayarı ve hafıza kartını bağlamaktır - dosyaları kopyalamak!connectWithUsbCable()yöntemi) hafıza kartının "ihtiyaçlarını" karşılamak için. Hafıza kartından veri kopyalamak isteyen bir kişiyi simüle edecek bir istemci programı oluşturalım:

public class Main { 

   public static void main(String[] args) { 

       USB cardReader = new CardReader(new MemoryCard()); 
       cardReader.connectWithUsbCable(); 
   } 
}
Peki ne elde ettik? Konsol çıktısı:

Memory card successfully inserted! 
The data has been copied to the computer!
Harika. Amacımıza ulaştık! Bağdaştırıcı kalıbı hakkında bilgi içeren bir video bağlantısı:

Okuyucu ve Yazar özet dersleri

Şimdi en sevdiğimiz aktiviteye geri döneceğiz: girdi ve çıktı ile çalışmak için birkaç yeni sınıf hakkında bilgi edinmek :) Şimdiye kadar kaç tanesini öğrendiğimizi merak ediyorum. Reader Bugün ve sınıfları hakkında konuşacağız Writer. Neden özellikle bu sınıflar? Çünkü adaptörlerle ilgili bir önceki bölümümüzle ilgililer. Onları daha ayrıntılı olarak inceleyelim. ile başlayacağız  Reader. Readersoyut bir sınıftır, bu nedenle açık bir şekilde nesneler oluşturamayacağız.   Ama aslında buna zaten aşinasınız! Ne de olsa onun soyundan gelen BufferedReaderve sınıflarını iyi tanıyorsunuz :)InputStreamReader

public class BufferedReader extends Reader { 
… 
} 

public class InputStreamReader extends Reader { 
… 
}
Sınıf InputStreamReader, klasik bir bağdaştırıcıdır. InputStreamMuhtemelen hatırladığınız gibi, bir nesneyi kurucusuna iletebiliriz . Bunu yapmak için genellikle değişkeni kullanırız System.in:

public static void main(String[] args) { 

   InputStreamReader inputStreamReader = new InputStreamReader(System.in); 
}
Ama ne yapar InputStreamReader? Her adaptör gibi, bir arabirimi diğerine dönüştürür.  Bu durumda, InputStreamarayüzden arayüze Reader. Başlangıçta, sınıfımız var InputStream. İyi çalışıyor, ancak yalnızca tek tek baytları okumak için kullanabilirsiniz. Ayrıca Readersoyut bir sınıfımız var. Bazı çok kullanışlı işlevleri var - karakterleri nasıl okuyacağını biliyor! Bu yeteneğe kesinlikle ihtiyacımız var. Ancak burada, genellikle bağdaştırıcılar tarafından çözülen klasik sorunla karşı karşıyayız - uyumsuz arabirimler. Bu ne anlama gelir? Oracle belgelerine bir göz atalım. İşte sınıfın yöntemleri InputStream. Adaptör tasarım deseni - 4Bir dizi yöntem tam olarak bir arayüzün ne olduğudur. Gördüğünüz gibi, bu sınıfın birread()yöntemi (aslında birkaç değişken), ancak yalnızca bayt okuyabilir: ya tek tek baytlar ya da bir arabellek kullanan birkaç bayt. Ancak bu seçenek bize uymuyor - karakterleri okumak istiyoruz. Soyut sınıfta zaten uygulananReader işlevselliğe ihtiyacımız var . Bunu belgelerde de görebiliriz. Adaptör tasarım deseni - 5Ancak, InputStreamve  Readerarabirimleri uyumsuzdur! Gördüğünüz gibi, yöntemin her uygulamasının read()farklı parametreleri ve dönüş değerleri vardır. Ve ihtiyacımız olan yer burası InputStreamReader! Sınıflarımız arasında bir adaptör görevi görecek .Yukarıda ele aldığımız kart okuyucu örneğinde olduğu gibi, uyarlanan sınıfın bir örneğini bağdaştırıcı sınıfının "içine" koyuyoruz, yani bir tanesini kurucusuna iletiyoruz. Önceki örnekte, MemoryCardiçine bir nesne koyduk CardReader. InputStream Şimdi yapıcıya bir nesne gönderiyoruz InputStreamReader! System.inTanıdık değişkenimizi şu şekilde kullanıyoruz InputStream:

public static void main(String[] args) { 

   InputStreamReader inputStreamReader = new InputStreamReader(System.in); 
}
Ve gerçekten de belgelerine baktığımızda InputStreamReaderuyarlamanın başarılı olduğunu görebiliriz :) Artık karakterleri okumak için elimizde yöntemler var. Adaptör tasarım deseni - 6Ve nesnemiz System.in(klavyeye bağlı akış) başlangıçta buna izin vermese de, dilin yaratıcıları bu sorunu bağdaştırıcı modelini uygulayarak çözdüler. ReaderÇoğu G/Ç sınıfı gibi soyut sınıfın da bir ikiz kardeşi vardır  — Writer. Aynı büyük avantaja sahiptir  Reader - karakterlerle çalışmak için uygun bir arayüz sağlar. Çıktı akışlarında sorun ve çözümü, girdi akışlarıyla aynı görünür. OutputStreamYalnızca bayt yazabilen bir sınıf var ,Writerkarakterlerle nasıl çalışılacağını bilen soyut sınıf ve iki uyumsuz arayüz var. Bu sorun bir kez daha adaptör modeli ile çözülmüştür.  Sınıfı ve  sınıflarının OutputStreamWriteriki arayüzünü  birbirine kolayca uyarlamak için kullanıyoruz . Yapıcıya bir bayt akışı geçirdikten sonra , bayt yerine karakter yazmak için bir kullanabiliriz !WriterOutputStreamOutputStreamOutputStreamWriter

import java.io.*; 

public class Main { 

   public static void main(String[] args) throws IOException { 

       OutputStreamWriter streamWriter = new OutputStreamWriter(new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt")); 
       streamWriter.write(32144); 
       streamWriter.close();
   } 
}
32144 (綐) kodlu karakteri dosyamıza yazdık, byte ile çalışma ihtiyacını ortadan kaldırdık :) Bugünlük bu kadar. Sonraki derslerde görüşmek üzere! :)
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION