سلام! اڄ اسان هڪ اهم نئين موضوع تي رابطو ڪنداسين - نمونن، يا ٻين لفظن ۾ - ڊيزائن جي نمونن . نمونا ڇا آهن؟ منهنجو خيال آهي ته توهان اظهار کي ڄاڻو ٿا "چيل کي ٻيهر نه ڏيو." پروگرامنگ ۾، جيئن ٻين ڪيترن ئي علائقن ۾، عام حالتن جو وڏو تعداد موجود آهن. انهن مان هر هڪ لاء، پروگرامنگ جي ترقي جي عمل ۾، تيار ڪيل ڪم ڪندڙ حل ٺاهيا ويا. اهي ڊزائن جا نمونا آهن. نسبتا ڳالهائڻ، هڪ نمونو هڪ خاص مثال آهي جيڪو هڪ صورتحال جو حل پيش ڪري ٿو جهڙوڪ: "جيڪڏهن توهان جي پروگرام کي ڪجهه ڪرڻ جي ضرورت آهي، اهو ڪيئن ڪجي. اتي ڪيترائي نمونا آھن، ھڪڙو بھترين ڪتاب ”مطالعي ڊيزائن جا نمونا“ انھن لاءِ وقف آھي، جيڪو توھان کي ضرور پڙھڻ گھرجي. ان کي ممڪن طور تي مختصر طور تي رکڻ لاء، هڪ نمونو هڪ عام مسئلو ۽ ان جي حل تي مشتمل آهي، جيڪو اڳ ۾ ئي هڪ قسم جي معيار کي سمجهي سگهجي ٿو. اڄ جي ليڪچر ۾ اسان انهن نمونن مان هڪ ”اڊاپٽر“ سان واقف ٿينداسين. ان جو نالو ٻڌائي رهيو آهي، ۽ توهان هڪ ڀيرو کان وڌيڪ حقيقي زندگي ۾ اڊاپٽرن ۾ آيا آهيو. سڀ کان وڌيڪ عام ايڊاپٽرز مان هڪ آهي ڪارڊ پڙهندڙ، جيڪي ڪيترن ئي ڪمپيوٽرن ۽ ليپ ٽاپ سان ليس هوندا آهن. تصور ڪريو ته اسان وٽ ڪجهه قسم جو ميموري ڪارڊ آهي. ڇا مسئلو آهي؟ حقيقت اها آهي ته هوء خبر ناهي ته ڪيئن ڪمپيوٽر سان لهه وچڙ ۾. انهن وٽ هڪ عام انٽرفيس نه آهي. ڪمپيوٽر ۾ هڪ 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 ذريعي ٻين ڊوائيسز سان ڳنڍي سگھي ٿو. تنهن ڪري، پروگرام ۾، اسان جو ڪلاس CardReader
USB انٽرفيس کي لاڳو ڪري ٿو. پر هن طريقي جي اندر ڇا ٿئي ٿو؟ ۽ اتي ئي ٿئي ٿو جيڪو اسان کي گهرجي! اڊاپٽر ڪم کي اسان جي ميموري ڪارڊ ڏانهن موڪلي ٿو. سڀ کان پوء، اڊاپٽر پاڻ ڪجھ به نه ڪندو آهي؛ ڪارڊ پڙهندڙ کي ڪا به آزاد ڪارڪردگي نه آهي. ان جو ڪم صرف ڪمپيوٽر ۽ ميموري ڪارڊ کي ڳنڍڻ آهي ته جيئن ڪارڊ پنهنجو ڪم ڪري سگهي ۽ فائلون ڪاپي ڪري سگهي! 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
. طريقن جو هڪ سيٽ هڪ انٽرفيس آهي. جئين توهان ڏسي سگهو ٿا، read()
هن طبقي ۾ هڪ طريقو آهي (جيتوڻيڪ ڪيترن ئي نسخن ۾)، پر اهو صرف بائيٽ پڙهي سگهي ٿو: يا ته انفرادي بائيٽ، يا بفر استعمال ڪندي ڪيترائي بائيٽ. هي اختيار اسان کي مناسب نه آهي - اسان اکرن کي پڙهڻ چاهيون ٿا. اسان کي گهربل ڪارڪردگي اڳ ۾ ئي خلاصي طبقي ۾ لاڳو ڪئي وئي آهيReader
. اهو پڻ دستاويز ۾ ڏسي سگهجي ٿو. تنهن هوندي به، 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
اسان ڏسنداسين ته "موافقت" ڪامياب ٿي وئي :) هاڻي اسان وٽ اسان جي اختياري طريقن تي آهي جيڪي اسان کي ڪردارن کي پڙهڻ جي اجازت ڏين ٿا. ۽ جيتوڻيڪ شروعات ۾ اسان جي اعتراض System.in
(ڪيبورڊ سان جڙيل هڪ ڌاڳو) اها اجازت نه ڏني هئي، اڊاپٽر نموني ٺاهي، ٻولي جي تخليق ڪندڙن اهو مسئلو حل ڪيو. خلاصو طبقو Reader
، اڪثر I/O طبقن وانگر، هڪ جڙيل ڀاءُ آهي - Writer
. اهو ساڳيو وڏو فائدو آهي Reader
- اهو علامتن سان ڪم ڪرڻ لاء هڪ آسان انٽرفيس مهيا ڪري ٿو. آئوٽ اسٽريم سان، مسئلو ۽ ان جو حل ساڳيو نظر اچي ٿو جيئن ان پٽ اسٽريمز جي صورت ۾. ھڪڙو طبقو آھي OutputStream
جيڪو صرف بائيٽ لکي سگھي ٿو. اتي ھڪڙو خلاصو طبقو آھي Writer
جيڪو ڪم ڪري سگھي ٿو علامتن سان، ۽ اتي ٻه غير مطابقت رکندڙ انٽرفيس آھن. اهو مسئلو ٻيهر ڪاميابي سان حل ڪيو ويو آهي اڊاپٽر جي نموني سان. هڪ طبقي کي استعمال ڪندي، OutputStreamWriter
اسان آساني سان ٻه طبقن جي انٽرفيس کي هڪ ٻئي Writer
سان ”مطابقت“ ڪري سگهون ٿا. ۽، ڪنسٽرڪٽر ۾ OutputStream
بائيٽ اسٽريم حاصل ڪرڻ سان ، ان جي مدد سان اسين، جيتوڻيڪ، ڪردار لکي سگھون ٿا، بائيٽ نه! OutputStream
OutputStreamWriter
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 - 綐 سان هڪ ڪردار لکيو، اهڙي طرح بائيٽ سان ڪم ڪرڻ جي ضرورت کي ختم ڪري ڇڏيو :) اهو سڀ ڪجهه اڄ لاءِ آهي، توهان کي ايندڙ ليڪچرن ۾ ملنداسين! :)
GO TO FULL VERSION