JavaRush /جاوا بلاگ /Random-SD /اڊاپٽر ڊيزائن جو نمونو ڪهڙو مسئلو حل ڪري ٿو؟

اڊاپٽر ڊيزائن جو نمونو ڪهڙو مسئلو حل ڪري ٿو؟

گروپ ۾ شايع ٿيل
سافٽ ويئر ڊولپمينٽ اڪثر ڪري پيچيده آهي اجزاء جي وچ ۾ عدم مطابقت جي ڪري جيڪي هڪ ٻئي سان ڪم ڪن ٿيون. مثال طور، جيڪڏهن توهان کي هڪ نئين لائبريري کي هڪ پراڻي پليٽ فارم سان ضم ڪرڻ جي ضرورت آهي جاوا جي اڳوڻي نسخن ۾ لکيل آهي، توهان کي شايد شيون جي غير مطابقت، يا وڌيڪ واضح طور تي، انٽرفيس کي منهن ڏيڻو پوي. هن معاملي ۾ ڇا ڪجي؟ ڪوڊ ٻيهر لکو؟ پر اهو ناممڪن آهي: سسٽم جو تجزيو گهڻو وقت وٺندو يا ڪم جي اندروني منطق ڀڄي ويندي. اڊاپٽر ڊيزائن جو نمونو ڪهڙا مسئلا حل ڪري ٿو - 1هن مسئلي کي حل ڪرڻ لاء، اهي اڊاپٽر جي نموني سان گڏ آيا، جيڪي شيون غير مطابقت رکندڙ انٽرفيس سان گڏ ڪم ڪرڻ ۾ مدد ڪن ٿيون. اچو ته ڏسو ته ڪيئن استعمال ڪجي!

مسئلي بابت وڌيڪ تفصيل

پهرين، اچو ته پراڻي نظام جي رويي کي نقل ڪريون. اچو ته اهو ڪم يا اسڪول لاء دير ٿيڻ جا سبب پيدا ڪري ٿي. هن کي ڪرڻ لاء، اسان وٽ هڪ انٽرفيس آهي Excuseجنهن ۾ طريقا شامل آهن generateExcuse()، likeExcuse()۽ dislikeExcuse().
public interface Excuse {
   String generateExcuse();
   void likeExcuse(String excuse);
   void dislikeExcuse(String excuse);
}
هي انٽرفيس ڪلاس پاران لاڳو ڪيو ويو آهي WorkExcuse:
public class WorkExcuse implements Excuse {
   private String[] reasonOptions = {"по невероятному стечению обстоятельств у нас в доме закончилась горячая вода и я ждал, пока солнечный свет, сконцентрированный через лупу, нагреет кружку воды, чтобы я мог умыться.",
   "искусственный интеллект в моем будильнике подвел меня и разбудил на час раньше обычного. Поскольку сейчас зима, я думал что еще ночь и уснул. Дальше все How в тумане.",
   "предпраздничное настроение замедляет метаболические процессы в моем организме и приводит к подавленному состоянию и бессоннице."};
   private String[] sorryOptions = {"Это, конечно, не повторится, мне очень жаль.", "Прошу меня извинить за непрофессиональное поведение.", "Нет оправдания моему поступку. Я недостоин этой должности."};

   @Override
   public String generateExcuse() { // Случайно выбираем отговорку из массива
       String result = "Я сегодня опоздал, потому что " + reasonOptions[(int) Math.round(Math.random() + 1)] + "\n" +
               sorryOptions[(int) Math.round(Math.random() + 1)];
       return result;
   }

   @Override
   public void likeExcuse(String excuse) {
       // Дублируем элемент в массиве, чтобы шанс его выпадения был выше
   }

   @Override
   public void dislikeExcuse(String excuse) {
       // Удаляем элемент из массива
   }
}
اچو ته مثال آزمائي:
Excuse excuse = new WorkExcuse();
System.out.println(excuse.generateExcuse());
نتيجو:
Я сегодня опоздал, потому что предпраздничное настроение замедляет метаболические процессы в моем организме и приводит к подавленному состоянию и бессоннице. 
Прошу меня извинить за непрофессиональное поведение.
هاڻي اچو ته تصور ڪريو ته توهان سروس شروع ڪئي، انگ اکر گڏ ڪيا ۽ محسوس ڪيو ته سروس استعمال ڪندڙن جي اڪثريت يونيورسٽي جا شاگرد آهن. ھن گروپ جي ضرورتن لاءِ ان کي بھتر ڪرڻ لاءِ، توھان خاص طور تي ھن لاءِ ٻئي ڊولپر کان عذر پيدا ڪرڻ واري نظام جو حڪم ڏنو. ڊولپمينٽ ٽيم تحقيق ڪئي، درجه بندي مرتب ڪئي، مصنوعي ذهانت سان ڳنڍيل، ٽرئفڪ جام، موسم، وغيره سان شامل ڪيل انضمام. ھاڻي توھان وٽ شاگردن لاءِ عذر پيدا ڪرڻ لاءِ لائبريري آھي، پر ان سان ڳالھائڻ لاءِ انٽرفيس مختلف آھي - StudentExcuse:
public interface StudentExcuse {
   String generateExcuse();
   void dislikeExcuse(String excuse);
}
انٽرفيس جا ٻه طريقا آهن: generateExcuse, جيڪو هڪ عذر پيدا ڪري ٿو، ۽ dislikeExcuse, جيڪو عذر کي بلاڪ ڪري ٿو ته جيئن اهو مستقبل ۾ ظاهر نه ٿئي. هڪ ٽئين پارٽي لائبريري ترميم لاءِ بند آهي - توهان ان جو سورس ڪوڊ تبديل نٿا ڪري سگهو. نتيجي طور، توھان جي سسٽم ۾ ٻه طبقا آھن جيڪي انٽرفيس کي لاڳو ڪن ٿا Excuse، ۽ ھڪڙي لائبريري ھڪڙي طبقي سان SuperStudentExcuseجيڪا انٽرفيس کي لاڳو ڪري ٿي StudentExcuse:
public class SuperStudentExcuse implements StudentExcuse {
   @Override
   public String generateExcuse() {
       // Логика нового функционала
       return "Невероятная отговорка, адаптированная под текущее состояние погоды, пробки or сбои в расписании общественного транспорта.";
   }

   @Override
   public void dislikeExcuse(String excuse) {
       // Добавляет причину в черный список
   }
}
ڪوڊ تبديل نه ٿو ڪري سگھجي. موجوده اسڪيم هن طرح نظر ايندي: اڊاپٽر - 2 ڊيزائن جو نمونو ڪهڙو مسئلو حل ڪري ٿو؟سسٽم جو هي نسخو صرف عذر انٽرفيس سان ڪم ڪري ٿو. توهان ڪوڊ ٻيهر نه لکي سگهو ٿا: وڏي ايپليڪيشن ۾، اهڙيون تبديليون گهڻو وقت وٺي سگهن ٿيون يا ايپليڪيشن جي منطق کي ٽوڙي سگهن ٿيون. توھان تجويز ڪري سگھوٿا مين انٽرفيس کي متعارف ڪرائڻ ۽ ھيرڪي کي وڌائڻ لاءِ: اڊاپٽر ڊيزائن جو نمونو ڪهڙا مسئلا حل ڪري ٿو - 3ھن کي ڪرڻ لاءِ، توھان کي انٽرفيس جو نالو تبديل ڪرڻو پوندو Excuse. پر اضافي حدن کي سنجيده ايپليڪيشنن ۾ ناپسنديده آهي: هڪ عام روٽ عنصر متعارف ڪرائڻ فن تعمير کي ڀڃي ٿو. هڪ وچولي طبقي کي لاڳو ڪيو وڃي جيڪو نئين ۽ پراڻي ڪارڪردگي کي گهٽ ۾ گهٽ نقصان سان استعمال ڪرڻ جي اجازت ڏيندو. مختصر ۾، توهان کي هڪ اڊاپٽر جي ضرورت آهي .

اڊاپٽر جو نمونو ڪيئن ڪم ڪري ٿو

هڪ اڊاپٽر هڪ وچولي اعتراض آهي جيڪو هڪ اعتراض تي طريقن کي ڪال ڪري ٿو جيڪو ٻئي کي سمجهي سگهجي ٿو. اچو ته اسان جي مثال لاء هڪ اڊاپٽر لاڳو ڪريو ۽ ان کي سڏين Middleware. اسان جي اڊاپٽر کي لازمي طور تي ھڪڙو انٽرفيس لاڳو ڪرڻ گھرجي جيڪو ھڪڙي شين سان مطابقت رکي. ان کي ٿيڻ ڏي Excuse. انهي جي مهرباني، Middlewareاهو پهريون اعتراض جي طريقن کي سڏي سگهي ٿو. Middlewareڪال وصول ڪري ٿو ۽ انهن کي ٻئي اعتراض ڏانهن هڪ مطابقت واري شڪل ۾ منتقل ڪري ٿو. Middlewareاھو آھي جيڪو ھڪڙي طريقي سان عمل ڪرڻ جي طريقن سان آھي generateExcuse۽ ڏسڻ ۾ اچي ٿو dislikeExcuse:
public class Middleware implements Excuse { // 1. Middleware становится совместимым с an objectом WorkExcuse через интерфейс Excuse

   private StudentExcuse superStudentExcuse;

   public Middleware(StudentExcuse excuse) { // 2. Получаем ссылку на адаптируемый an object
       this.superStudentExcuse = excuse;
   }

   @Override
   public String generateExcuse() {
       return superStudentExcuse.generateExcuse(); // 3. Адаптер реализовывает метод интерфейса
   }

    @Override
    public void dislikeExcuse(String excuse) {
        // Метод предварительно помещает отговорку в черный список БД,
        // Затем передает ее в метод dislikeExcuse an object superStudentExcuse.
    }
   // Метод likeExcuse появятся позже
}
جاچ (ڪلائنٽ ڪوڊ ۾):
public class Test {
   public static void main(String[] args) {
       Excuse excuse = new WorkExcuse(); // Создаются an objectы классов,
       StudentExcuse newExcuse = new SuperStudentExcuse(); // Которые должны быть совмещены.
       System.out.println("Обычная причина для работника:");
       System.out.println(excuse.generateExcuse());
       System.out.println("\n");
       Excuse adaptedStudentExcuse = new Middleware(newExcuse); // Оборачиваем новый функционал в an object-адаптер
       System.out.println("Использование нового функционала с помощью адаптера:");
       System.out.println(adaptedStudentExcuse.generateExcuse()); // Адаптер вызывает адаптированный метод
   }
}
نتيجو:
Обычная причина для работника:
Я сегодня опоздал, потому что предпраздничное настроение замедляет метаболические процессы в моем организме и приводит к подавленному состоянию и бессоннице.
Нет оправдания моему поступку. Я недостоин этой должности. Использование нового функционала с помощью адаптера
هڪ ناقابل اعتماد عذر، موجوده موسمي حالتن سان ٺهڪندڙ، ٽرئفڪ جام يا عوامي ٽرانسپورٽ شيڊول ۾ رڪاوٽون. اهو طريقو generateExcuseصرف ڪال کي ڪنهن ٻئي اعتراض ڏانهن منتقل ڪري ٿو، بغير اضافي تبديلين جي. طريقي dislikeExcuseجي ضرورت آهي پهرين عذر کي ڊيٽابيس جي بليڪ لسٽ تي رکڻ. اضافي وچولي ڊيٽا پروسيسنگ اهو ئي سبب آهي ته اڊاپٽر نموني کي پيار ڪيو ويندو آهي. پر ڇا هڪ طريقو آهي likeExcuseجيڪو انٽرفيس ۾ آهي Excuse، پر نه StudentExcuse؟ هي آپريشن نئين ڪارڪردگي ۾ سپورٽ نه آهي. اهڙي صورت ۾، اهي هڪ استثنا سان گڏ آيا آهن UnsupportedOperationException: اهو اڇلايو ويندو آهي جيڪڏهن گهربل آپريشن جي حمايت نه ڪئي وئي آهي. اچو ته هي استعمال ڪريون. اھو اھو آھي جيڪو نئين طبقي تي عمل ڪرڻ جھڙو آھي Middleware:
public class Middleware implements Excuse {

   private StudentExcuse superStudentExcuse;

   public Middleware(StudentExcuse excuse) {
       this.superStudentExcuse = excuse;
   }

   @Override
   public String generateExcuse() {
       return superStudentExcuse.generateExcuse();
   }

   @Override
   public void likeExcuse(String excuse) {
       throw new UnsupportedOperationException("Метод likeExcuse не поддерживается в новом функционале");
   }

   @Override
   public void dislikeExcuse(String excuse) {
       // Метод обращается за дополнительной информацией к БД,
       // Затем передает ее в метод dislikeExcuse an object superStudentExcuse.
   }
}
پهرين نظر ۾، هي حل ڪامياب نه ٿو لڳي، پر ڪارڪردگي کي تخليق ڪرڻ سان وڌيڪ پيچيده صورتحال پيدا ٿي سگهي ٿي. جيڪڏهن ڪلائنٽ محتاط آهي ۽ اڊاپٽر چڱي طرح دستاويز ٿيل آهي، اهو حل قابل قبول آهي.

جڏهن اڊاپٽر استعمال ڪيو وڃي

  1. جيڪڏهن توهان کي ٽئين پارٽي ڪلاس استعمال ڪرڻ جي ضرورت آهي، پر ان جو انٽرفيس مکيه ايپليڪيشن سان مطابقت ناهي. مٿي ڏنل مثال ڏيکاري ٿو ته هڪ شيم اعتراض ڪيئن ٺاهيو ويو آهي جيڪو ٽارگيٽ اعتراض کي سمجھڻ واري شڪل ۾ ڪالن کي لپي ٿو.

  2. جڏهن ته ڪيترن ئي موجود ذيلي طبقن کي عام ڪارڪردگي هجڻ گهرجي. اضافي ذيلي طبقن جي بدران (انهن جي تخليق ڪوڊ جي نقل کي ڏسندي)، اهو بهتر آهي ته هڪ اڊاپٽر استعمال ڪرڻ لاء.

فائدا ۽ نقصان

فائدو: اڊاپٽر ڪلائنٽ کان لڪائيندو آهي پروسيسنگ درخواستن جا تفصيل هڪ اعتراض کان ٻئي ڏانهن. ڪلائنٽ ڪوڊ ڊيٽا کي فارميٽ ڪرڻ يا ٽارگيٽ طريقي سان ڪالن کي هٿي ڏيڻ بابت نه ٿو سوچي. اهو تمام پيچيده آهي، ۽ پروگرامر سست آهن :) نقصان: پروجيڪٽ جو ڪوڊ بيس اضافي طبقن جي ڪري پيچيده آهي، ۽ جيڪڏهن هڪ وڏي تعداد ۾ ناگزير نقطا آهن، انهن جو تعداد اڻڄاتل سائيز تائين وڌي سگهي ٿو.

منهن ۽ سينگار سان پريشان نه ٿيڻ گهرجي

سطحي امتحان تي، اڊاپٽر کي منهن ۽ سجاڳي جي نمونن سان پريشان ٿي سگھي ٿو. هڪ اڊاپٽر ۽ هڪ Facade جي وچ ۾ فرق اهو آهي ته هڪ Facade هڪ نئون انٽرفيس متعارف ڪرايو آهي ۽ هڪ مڪمل سبسسٽم لپي ٿو. خير، سجاڳ، اڊاپٽر جي برعڪس، پاڻ کي تبديل ڪري ٿو اعتراض، نه انٽرفيس.

قدم قدم تي عمل درآمد الورورٿم

  1. پهرين، پڪ ڪريو ته ڪو مسئلو آهي ته اهو نمونو حل ڪري سگهي ٿو.

  2. هڪ ڪلائنٽ انٽرفيس جي وضاحت ڪريو جنهن جي طرفان ٻيو ڪلاس استعمال ڪيو ويندو.

  3. پوئين قدم ۾ بيان ڪيل انٽرفيس جي بنياد تي اڊاپٽر ڪلاس کي لاڳو ڪريو.

  4. اڊاپٽر ڪلاس ۾، ھڪڙو فيلڊ ٺاھيو جيڪو اعتراض جي حوالي سان ذخيرو ڪري ٿو. ھي حوالو ٺاھيندڙ ۾ منظور ڪيو ويو آھي.

  5. اڊاپٽر ۾ سڀني ڪلائنٽ انٽرفيس طريقن کي لاڳو ڪريو. طريقو ٿي سگهي ٿو:

    • ڪال کي بغير تبديلي جي منتقلي؛

    • ڊيٽا تبديل ڪريو، ھدف واري طريقي سان ڪالن جو تعداد وڌايو / گھٽايو، ڊيٽا جي ٺاھڻ کي وڌيڪ وڌايو، وغيره.

    • آخري حل جي طور تي، جيڪڏهن ڪو خاص طريقو غير مطابقت رکندڙ آهي، هڪ UnsupportedOperationException اڇلايو، جنهن کي سختي سان دستاويز ڪرڻ جي ضرورت آهي.

  6. جيڪڏهن ايپليڪيشن صرف ڪلائنٽ انٽرفيس ذريعي اڊاپٽر استعمال ڪري ٿي (جيئن مٿي ڏنل مثال ۾)، هي اڊاپٽر کي مستقبل ۾ بي درديءَ سان وڌائڻ جي اجازت ڏيندو.

يقينن، ڊزائن جو نمونو سڀني بيمارين لاء علاج نه آهي، پر ان جي مدد سان توهان مختلف انٽرفيس سان شين جي غير مطابقت جي مسئلي کي حل ڪري سگهو ٿا. هڪ ڊولپر جيڪو ڄاڻي ٿو بنيادي نمونن جا ڪيترائي قدم مٿي آهن انهن لاءِ جيڪي صرف ڄاڻن ٿا ته الورورٿم ڪيئن لکجي، ڇاڪاڻ ته انهن کي سنجيده ايپليڪيشنون ٺاهڻ جي ضرورت آهي. ڪوڊ ٻيهر استعمال ڪرڻ ڏکيو ٿي ويندو آهي ۽ برقرار رکڻ هڪ خوشي آهي. اهو سڀ ڪجهه اڄ لاء آهي! پر اسان جلد ئي مختلف ڊيزائن جي نمونن سان اسان جي واقفيت جاري ڪنداسين :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION