JavaRush /جاوا بلاگ /Random-SD /ڊيزائن پيٽرن اڊاپٽر

ڊيزائن پيٽرن اڊاپٽر

گروپ ۾ شايع ٿيل
سلام! اڄ اسان هڪ اهم نئين موضوع تي رابطو ڪنداسين - نمونن، يا ٻين لفظن ۾ - ڊيزائن جي نمونن . نمونا ڇا آهن؟ منهنجو خيال آهي ته توهان اظهار کي ڄاڻو ٿا "چيل کي ٻيهر نه ڏيو." پروگرامنگ ۾، جيئن ٻين ڪيترن ئي علائقن ۾، عام حالتن جو وڏو تعداد موجود آهن. انهن مان هر هڪ لاء، پروگرامنگ جي ترقي جي عمل ۾، تيار ڪيل ڪم ڪندڙ حل ٺاهيا ويا. اهي ڊزائن جا نمونا آهن. نسبتا ڳالهائڻ، هڪ نمونو هڪ خاص مثال آهي جيڪو هڪ صورتحال جو حل پيش ڪري ٿو جهڙوڪ: "جيڪڏهن توهان جي پروگرام کي ڪجهه ڪرڻ جي ضرورت آهي، اهو ڪيئن ڪجي. اتي ڪيترائي نمونا آھن، ھڪڙو بھترين ڪتاب ”مطالعي ڊيزائن جا نمونا“ انھن لاءِ وقف آھي، جيڪو توھان کي ضرور پڙھڻ گھرجي. ڊيزائن جو نمونو "اڊاپٽر" - 2ان کي ممڪن طور تي مختصر طور تي رکڻ لاء، هڪ نمونو هڪ عام مسئلو ۽ ان جي حل تي مشتمل آهي، جيڪو اڳ ۾ ئي هڪ قسم جي معيار کي سمجهي سگهجي ٿو. اڄ جي ليڪچر ۾ اسان انهن نمونن مان هڪ ”اڊاپٽر“ سان واقف ٿينداسين. ان جو نالو ٻڌائي رهيو آهي، ۽ توهان هڪ ڀيرو کان وڌيڪ حقيقي زندگي ۾ اڊاپٽرن ۾ آيا آهيو. سڀ کان وڌيڪ عام ايڊاپٽرز مان هڪ آهي ڪارڊ پڙهندڙ، جيڪي ڪيترن ئي ڪمپيوٽرن ۽ ليپ ٽاپ سان ليس هوندا آهن. اڊاپٽر ڊيزائن جو نمونو - 3تصور ڪريو ته اسان وٽ ڪجهه قسم جو ميموري ڪارڊ آهي. ڇا مسئلو آهي؟ حقيقت اها آهي ته هوء خبر ناهي ته ڪيئن ڪمپيوٽر سان لهه وچڙ ۾. انهن وٽ هڪ عام انٽرفيس نه آهي. ڪمپيوٽر ۾ هڪ USB ڪنيڪٽر آهي، پر توهان ان ۾ ميموري ڪارڊ داخل نٿا ڪري سگهو. ڪارڊ ڪمپيوٽر ۾ داخل نه ٿو ڪري سگھجي، جنهن جي ڪري اسان پنهنجون تصويرون، وڊيوز ۽ ٻيو ڊيٽا محفوظ نه ڪري سگهنداسين. ڪارڊ پڙهندڙ هڪ اڊاپٽر آهي جيڪو هن مسئلي کي حل ڪري ٿو. آخرڪار، اهو هڪ USB ڪيبل آهي! ڪارڊ جي برعڪس، ڪارڊ ريڊر کي ڪمپيوٽر ۾ داخل ڪري سگھجي ٿو. انهن وٽ ڪمپيوٽر سان گڏ هڪ عام انٽرفيس آهي - USB. اچو ته ڏسو ته اهو ڇا ٿيندو مثال سان:
public interface USB {

   void connectWithUsbCable();
}
هي اسان جو يو ايس بي انٽرفيس آهي جنهن ۾ يو ايس بي ڪيبل داخل ڪرڻ جو واحد طريقو آهي:
public class MemoryCard {

   public void insert() {
       System.out.println("Карта памяти успешно вставлена!");
   }

   public void copyData() {
       System.out.println("Данные скопированы на компьютер!");
   }
}
هي اسان جو طبقو آهي جيڪو ميموري نقشي کي لاڳو ڪري ٿو. اهو اڳ ۾ ئي 2 طريقا آهن جن جي اسان کي ضرورت آهي، پر هتي مسئلو آهي: اهو USB انٽرفيس کي لاڳو نٿو ڪري. ڪارڊ USB سلاٽ ۾ داخل نه ٿو ڪري سگھجي.
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();
   }
}
۽ هتي اسان جو اڊاپٽر آهي! ڪلاسCardReader ڇا ڪندو آهي ۽ اهو هڪ اڊاپٽر ڇو آهي؟ اهو سادو آهي. ڪلاس کي ترتيب ڏنو پيو وڃي (ميموري نقشو) اڊاپٽر جي شعبن مان هڪ بڻجي ويندو آهي. اهو منطقي آهي، ڇاڪاڻ ته حقيقي زندگي ۾ اسان ڪارڊ ريڊر جي اندر پڻ هڪ ڪارڊ داخل ڪندا آهيون، ۽ اهو پڻ ان جو حصو بڻجي ويندو آهي. ميموري ڪارڊ جي برعڪس، اڊاپٽر کي ڪمپيوٽر سان گڏ هڪ عام انٽرفيس آهي. اهو هڪ USB ڪيبل آهي، مطلب ته اهو USB ذريعي ٻين ڊوائيسز سان ڳنڍي سگھي ٿو. تنهن ڪري، پروگرام ۾، اسان جو ڪلاس CardReaderUSB انٽرفيس کي لاڳو ڪري ٿو. پر هن طريقي جي اندر ڇا ٿئي ٿو؟ ۽ اتي ئي ٿئي ٿو جيڪو اسان کي گهرجي! اڊاپٽر ڪم کي اسان جي ميموري ڪارڊ ڏانهن موڪلي ٿو. سڀ کان پوء، اڊاپٽر پاڻ ڪجھ به نه ڪندو آهي؛ ڪارڊ پڙهندڙ کي ڪا به آزاد ڪارڪردگي نه آهي. ان جو ڪم صرف ڪمپيوٽر ۽ ميموري ڪارڊ کي ڳنڍڻ آهي ته جيئن ڪارڊ پنهنجو ڪم ڪري سگهي ۽ فائلون ڪاپي ڪري سگهي! connectWithUsbCable()اسان جو اڊاپٽر ان کي ميموري ڪارڊ جي ”ضرورتن“ لاءِ پنهنجو انٽرفيس (طريقو) مهيا ڪندي ائين ڪرڻ جي اجازت ڏئي ٿو . اچو ته ڪجهه قسم جو ڪلائنٽ پروگرام ٺاهيون جيڪو هڪ شخص کي نقل ڪندو جيڪو ميموري ڪارڊ مان ڊيٽا نقل ڪرڻ چاهي ٿو:
public class Main {

   public static void main(String[] args) {

       USB cardReader = new CardReader(new MemoryCard());
       cardReader.connectWithUsbCable();

   }
}
نتيجي ۾ اسان کي ڇا مليو؟ ڪنسول آئوٽ:
Карта памяти успешно вставлена!
Данные скопированы на компьютер!
عظيم، اسان جو ڪم ڪاميابي سان مڪمل ڪيو ويو آهي! هتي اڊاپٽر جي نموني بابت معلومات سان گڏ ڪجهه اضافي لنڪس آهن:

خلاصو ڪلاس پڙهندڙ ۽ ليکڪ

هاڻي اسان پنهنجي پسنديده تفريح ڏانهن موٽنداسين: اسان ان پٽ ۽ آئوٽ پٽ سان ڪم ڪرڻ لاءِ ڪجهه نوان ڪلاس سيکارينداسين :) انهن مان ڪيترا اسان اڳي ئي سکي چڪا آهيون، مان حيران آهيان؟ اڄ اسان ڪلاس بابت ڳالهائينداسين Reader۽ Writer. انهن جي باري ۾ ڇو؟ ڇو ته هي اسان جي پوئين حصي سان لاڳاپيل هوندو - ايڊاپٽرز. اچو ته انهن کي وڌيڪ تفصيل سان ڏسو. اچو ته Reader'ا' سان شروع ڪريون. Readerهڪ خلاصو طبقو آهي، تنهنڪري اسان واضح طور تي ان جي شين کي ٺاهي نه سگهنداسين. پر حقيقت ۾، توهان هن کي اڳ ۾ ئي ڄاڻو ٿا! سڀ کان پوء، طبقن جيڪي توهان چڱي طرح ڄاڻو ٿا ان جا وارث BufferedReaderآهن :)InputStreamReader
public class BufferedReader extends Reader {}

public class InputStreamReader extends Reader {}
تنهن ڪري، هڪ ڪلاس InputStreamReaderهڪ کلاسک اڊاپٽر آهي . جئين توهان کي ياد آهي، اسان هڪ اعتراض کي ان جي تعمير ڪندڙ ڏانهن منتقل ڪري سگهون ٿا InputStream. گهڻو ڪري اسان هن لاء هڪ متغير استعمال ڪندا آهيون System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
اهو ڇا ٿو ڪري InputStreamReader؟ ڪنهن به اڊاپٽر وانگر، اهو هڪ انٽرفيس کي ٻئي ۾ بدلائي ٿو. انهي صورت ۾، انٽرفيس InputStream'a کان انٽرفيس Reader' a. شروع ۾ اسان جو ڪلاس هوندو هو InputStream. اهو سٺو ڪم ڪري ٿو، پر اهو صرف انفرادي بائيٽ پڙهي سگهي ٿو. ان کان علاوه، اسان وٽ ھڪڙو خلاصو طبقو آھي Reader. اھو بھترين ڪارڪردگي آھي جنھن جي اسان کي واقعي ضرورت آھي - اھو اکرن کي پڙھي سگھي ٿو! اسان کي، يقينا، واقعي هن موقعي جي ضرورت آهي. پر هتي اسان کي هڪ کلاسک مسئلو سان منهن ڏيڻو پيو آهي ته اڊاپٽر عام طور تي حل ڪن ٿا - انٽرفيس غير مطابقت. اهو ڪيئن پاڻ کي ظاهر ڪري ٿو؟ اچو ته سڌو سنئون Oracle دستاويزن ۾ ڏسو. هتي ڪلاس جا طريقا آهن InputStream. Паттерн проектирования «Адаптер» - 4طريقن جو هڪ سيٽ هڪ انٽرفيس آهي. جئين توهان ڏسي سگهو ٿا، read()هن طبقي ۾ هڪ طريقو آهي (جيتوڻيڪ ڪيترن ئي نسخن ۾)، پر اهو صرف بائيٽ پڙهي سگهي ٿو: يا ته انفرادي بائيٽ، يا بفر استعمال ڪندي ڪيترائي بائيٽ. هي اختيار اسان کي مناسب نه آهي - اسان اکرن کي پڙهڻ چاهيون ٿا. اسان کي گهربل ڪارڪردگي اڳ ۾ ئي خلاصي طبقي ۾ لاڳو ڪئي وئي آهيReader . اهو پڻ دستاويز ۾ ڏسي سگهجي ٿو. Паттерн проектирования «Адаптер» - 5تنهن هوندي به، InputStream'a' ۽ Reader'a' interfaces غير مطابقت آهن! جئين توهان ڏسي سگهو ٿا، سڀني طريقن جي عملن ۾، read()ٻنهي پاس ٿيل پيٽرولر ۽ واپسي جا قدر مختلف آهن. ۽ هي آهي جتي اسان کي ضرورت آهي InputStreamReader! هو اسان جي طبقن جي وچ ۾ هڪ اڊاپٽر طور ڪم ڪندو . جيئن مثال طور ڪارڊ ريڊر سان، جنهن کي اسان مٿي ڏٺو، اسان "مطابقت ڪيل" طبقي جي اعتراض کي "اندروني طور تي" منتقل ڪريون ٿا، اهو آهي، اڊاپٽر ڪلاس جي تعمير ڪندڙ ڏانهن. پوئين مثال ۾، اسان MemoryCardاندر هڪ اعتراض گذريو CardReader. ھاڻي اسان اعتراض کي InputStreamٺاھيندڙ ڏانھن منتقل ڪريون ٿا InputStreamReader! معيار جي طور تي InputStreamاسان اڳ ۾ ئي واقف متغير استعمال ڪندا آهيون System.in:
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
۽ درحقيقت: دستاويزن کي ڏسڻ سان InputStreamReaderاسان ڏسنداسين ته "موافقت" ڪامياب ٿي وئي :) هاڻي اسان وٽ اسان جي اختياري طريقن تي آهي جيڪي اسان کي ڪردارن کي پڙهڻ جي اجازت ڏين ٿا. Паттерн проектирования «Адаптер» - 6۽ جيتوڻيڪ شروعات ۾ اسان جي اعتراض System.in(ڪيبورڊ سان جڙيل هڪ ڌاڳو) اها اجازت نه ڏني هئي، اڊاپٽر نموني ٺاهي، ٻولي جي تخليق ڪندڙن اهو مسئلو حل ڪيو. خلاصو طبقو Reader، اڪثر I/O طبقن وانگر، هڪ جڙيل ڀاءُ آهي - Writer. اهو ساڳيو وڏو فائدو آهي Reader- اهو علامتن سان ڪم ڪرڻ لاء هڪ آسان انٽرفيس مهيا ڪري ٿو. آئوٽ اسٽريم سان، مسئلو ۽ ان جو حل ساڳيو نظر اچي ٿو جيئن ان پٽ اسٽريمز جي صورت ۾. ھڪڙو طبقو آھي OutputStreamجيڪو صرف بائيٽ لکي سگھي ٿو. اتي ھڪڙو خلاصو طبقو آھي Writerجيڪو ڪم ڪري سگھي ٿو علامتن سان، ۽ اتي ٻه غير مطابقت رکندڙ انٽرفيس آھن. اهو مسئلو ٻيهر ڪاميابي سان حل ڪيو ويو آهي اڊاپٽر جي نموني سان. هڪ طبقي کي استعمال ڪندي، OutputStreamWriterاسان آساني سان ٻه طبقن جي انٽرفيس کي هڪ ٻئي Writerسان ”مطابقت“ ڪري سگهون ٿا. ۽، ڪنسٽرڪٽر ۾ OutputStreamبائيٽ اسٽريم حاصل ڪرڻ سان ، ان جي مدد سان اسين، جيتوڻيڪ، ڪردار لکي سگھون ٿا، بائيٽ نه! OutputStreamOutputStreamWriter
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 - 綐 سان هڪ ڪردار لکيو، اهڙي طرح بائيٽ سان ڪم ڪرڻ جي ضرورت کي ختم ڪري ڇڏيو :) اهو سڀ ڪجهه اڄ لاءِ آهي، توهان کي ايندڙ ليڪچرن ۾ ملنداسين! :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION