CodeGym /جاوا بلاگ /Random-SD /اڊاپٽر ڊيزائن جو نمونو
John Squirrels
سطح
San Francisco

اڊاپٽر ڊيزائن جو نمونو

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

   void connectWithUsbCable();
}
هي اسان جو USB انٽرفيس آهي جيڪو USB ذريعي ڳنڍڻ لاءِ صرف هڪ طريقو آهي.
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!");
   }
}
هي اسان جو طبقو آهي جيڪو ميموري ڪارڊ جي نمائندگي ڪري ٿو. ان وٽ اڳ ۾ ئي 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ڪندو آهي ۽ ڇا واقعي ان کي اڊاپٽر بڻائي ٿو؟ اهو سڀ سادو آهي. ڪلاس کي ترتيب ڏنو پيو وڃي (MemoryCard) اڊاپٽر جي فيلڊ مان هڪ ٿي وڃي ٿي. اها ڳالهه سمجهه ۾ اچي ٿي. جڏهن اسان حقيقي زندگي ۾ ڪارڊ ريڊر اندر ميموري ڪارڊ رکون ٿا ته اهو پڻ ان جو حصو بڻجي وڃي ٿو. ميموري ڪارڊ جي برعڪس، اڊاپٽر ڪمپيوٽر سان انٽرفيس شيئر ڪري ٿو. ان ۾ هڪ USB ڪيبل آهي، يعني ان کي USB ذريعي ٻين ڊوائيسز سان ڳنڍي سگهجي ٿو. ان ڪري اسان جو ڪارڊ ريڊر ڪلاس USB انٽرفيس کي لاڳو ڪري ٿو. پر ڇا واقعي هن طريقي جي اندر ٿئي ٿو؟ بلڪل ائين جيڪو اسان کي ٿيڻو آهي! اڊاپٽر ڪم کي اسان جي ميموري ڪارڊ ڏانهن موڪلي ٿو. درحقيقت، اڊاپٽر پاڻ کي ڪجھ به نٿو ڪري. هڪ ڪارڊ پڙهندڙ کي ڪا به آزاد ڪارڪردگي نه آهي. ان جو ڪم صرف ڪمپيوٽر ۽ ميموري ڪارڊ کي ڳنڍڻ آهي ته جيئن ڪارڊ کي ان جي ڪم ڪرڻ جي اجازت ڏني وڃي - فائلن کي نقل ڪرڻ! connectWithUsbCable()اسان جو اڊاپٽر ميموري ڪارڊ جي ”ضرورتن“ کي پورو ڪرڻ لاءِ پنهنجو انٽرفيس (طريقي) مهيا ڪندي ان کي قابل بڻائي ٿو . اچو ته ڪجهه ڪلائنٽ پروگرام ٺاهيون جيڪو هڪ شخص کي نقل ڪندو جيڪو ميموري ڪارڊ مان ڊيٽا نقل ڪرڻ چاهي ٿو:
public class Main {

   public static void main(String[] args) {

       USB cardReader = new CardReader(new MemoryCard());
       cardReader.connectWithUsbCable();
   }
}
پوء اسان کي ڇا مليو؟ ڪنسول آئوٽ:

Memory card successfully inserted! 
The data has been copied to the computer!
تمام سٺو. اسان پنهنجو مقصد حاصل ڪيو! هتي اڊاپٽر جي نموني بابت معلومات سان گڏ هڪ وڊيو جي لنڪ آهي:

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

ھاڻي اسان پنھنجي پسنديده سرگرمي ڏانھن موٽنداسين: ان پٽ ۽ آئوٽ پُٽ سان ڪم ڪرڻ لاءِ ڪجھ نون ڪلاسن جي باري ۾ سکڻ :) مون کي عجب لڳندو آھي ته اسان اڳي ئي ڪيترا سکيا آھن. اڄ اسان بابت ڳالهائينداسين Reader ۽ Writerڪلاس. خاص طور تي اهي طبقا ڇو؟ ڇاڪاڻ ته اهي adapters جي باري ۾ اسان جي پوئين حصي سان لاڳاپيل آهن. اچو ته انهن کي وڌيڪ تفصيل سان جانچيو. اسان سان شروع ڪنداسين  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انٽرفيس ته Readerانٽرفيس. شروعات ۾، اسان وٽ InputStreamڪلاس آهي. اهو سٺو ڪم ڪري ٿو، پر توهان صرف انفرادي بائيٽ پڙهڻ لاء استعمال ڪري سگهو ٿا. ان کان علاوه، اسان وٽ ھڪڙو Readerخلاصو طبقو آھي. ان ۾ ڪجھ تمام مفيد ڪارڪردگي آھي - اھو ڄاڻي ٿو ته ڪيئن پڙھجي اکرن کي! اسان کي ضرور هن صلاحيت جي ضرورت آهي. پر هتي اسان کي منهن ڏيڻو آهي کلاسک مسئلو عام طور تي ايڊاپٽرز ذريعي حل ڪيو ويندو آهي - غير مطابقت واري انٽرفيس. هن جو مطلب ڇا آهي؟ اچو ته Oracle دستاويزن تي هڪ نظر رکون. هتي ڪلاس جا طريقا آهن InputStream. اڊاپٽر ڊيزائن جو نمونو - 4طريقن جو هڪ سيٽ خاص طور تي هڪ انٽرفيس ڇا آهي. جئين توهان ڏسي سگهو ٿا، هن طبقي ۾ هڪ read()طريقو آهي (حقيقت ۾ ڪجهه مختلف قسمون)، پر اهو صرف بائيٽ پڙهي سگهي ٿو: يا ته انفرادي بائيٽ، يا بفر استعمال ڪندي ڪيترائي بائيٽ. پر هي اختيار اسان کي مناسب نه آهي - اسان ڪردارن کي پڙهڻ چاهيون ٿا. اسان کي ڪارڪردگي جي ضرورت آهي جيڪا اڳ ۾ ئي تجريدي طبقي ۾ لاڳو ڪئي وئيReader آهي . اسان هن دستاويز ۾ پڻ ڏسي سگهون ٿا. اڊاپٽر ڊيزائن جو نمونو - 5جڏهن ته، InputStream۽  Readerانٽرفيس غير مطابقت آهن! جئين توهان ڏسي سگهو ٿا، read()طريقي جي هر عمل درآمد ۾ مختلف پيٽرولر ۽ واپسي جا قدر آهن. ۽ هي آهي جتي اسان کي ضرورت آهي InputStreamReader! اهو اسان جي طبقن جي وچ ۾ هڪ اڊاپٽر طور ڪم ڪندو . جيئن مثال طور ڪارڊ ريڊر سان، جنهن تي اسان مٿي غور ڪيو، اسان هڪ مثال ڏيون ٿا ڪلاس کي ”اندر“ اڊاپٽر ڪلاس جي موافقت، يعني اسان هڪ کي ان جي تعمير ڪندڙ ڏانهن منتقل ڪريون ٿا. پوئين مثال ۾، اسان MemoryCardاندر هڪ اعتراض رکون ٿا CardReader. ھاڻي اسان ھڪڙي InputStream اعتراض کي ٺاھيندڙ ڏانھن منتقل ڪري رھيا آھيون InputStreamReader! اسان پنهنجو واقف System.inمتغير استعمال ڪريون ٿا جيئن InputStream:
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 ڪلاسز کي ھڪ ٻئي سان ٺاھڻ لاءِ. هڪ 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 (綐) سان ڪردار لکيو، بائيٽ سان ڪم ڪرڻ جي ضرورت کي ختم ڪندي :) اهو اڄ لاءِ آهي. ايندڙ سبقن ۾ ملنداسين! :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION