JavaRush /Blog Jawa /Random-JV /Masalah apa sing diatasi dening pola desain Adaptor?

Masalah apa sing diatasi dening pola desain Adaptor?

Diterbitake ing grup
Pangembangan piranti lunak asring rumit amarga ora kompatibel ing antarane komponen sing bisa digunakake. Contone, yen sampeyan kudu nggabungake perpustakaan anyar karo platform lawas ditulis ing versi sadurungé saka Jawa, sampeyan bisa nemoni incompatibility obyek, utawa luwih tepat, antarmuka. Apa sing kudu ditindakake ing kasus iki? Tulis maneh kode? Nanging iki ora mungkin: nganalisa sistem bakal entuk akeh wektu utawa logika internal karya bakal rusak. Masalah apa sing diatasi pola desain Adaptor - 1Kanggo ngatasi masalah iki, padha teka munggah karo pola Adaptor, kang mbantu obyek karo antarmuka sing ora kompatibel bisa bebarengan. Ayo padha ndeleng carane nggunakake!

Rincian liyane babagan masalah kasebut

Pisanan, ayo simulasi prilaku sistem lawas. Ayo dadi njalari alasan kanggo telat kanggo karya utawa sekolah. Kanggo nindakake iki, kita duwe antarmuka Excusesing ngemot cara generateExcuse(), likeExcuse()lan dislikeExcuse().
public interface Excuse {
   String generateExcuse();
   void likeExcuse(String excuse);
   void dislikeExcuse(String excuse);
}
Antarmuka iki diimplementasikake dening kelas 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) {
       // Удаляем элемент из массива
   }
}
Ayo nyoba contone:
Excuse excuse = new WorkExcuse();
System.out.println(excuse.generateExcuse());
Kesimpulan:
Я сегодня опоздал, потому что предпраздничное настроение замедляет метаболические процессы в моем организме и приводит к подавленному состоянию и бессоннице. 
Прошу меня извинить за непрофессиональное поведение.
Saiki ayo bayangake yen sampeyan ngluncurake layanan kasebut, ngumpulake statistik lan ngerteni manawa mayoritas pangguna layanan yaiku mahasiswa. Kanggo nambah kanggo kabutuhan grup iki, sampeyan dhawuh sistem generasi alesan saka pangembang liyane khusus kanggo dheweke. Tim pangembangan nindakake riset, nyusun rating, nyambungake intelijen buatan, nambahake integrasi karo macet, cuaca, lan liya-liyane. Saiki sampeyan duwe perpustakaan kanggo nggawe alesan kanggo siswa, nanging antarmuka kanggo sesambungan karo iku beda - StudentExcuse:
public interface StudentExcuse {
   String generateExcuse();
   void dislikeExcuse(String excuse);
}
Antarmuka nduweni rong cara: generateExcuse, sing ngasilake alesan, lan dislikeExcuse, sing ngalangi alesan kasebut supaya ora katon ing mangsa ngarep. Pustaka pihak katelu ditutup kanggo nyunting - sampeyan ora bisa ngganti kode sumber. Akibaté, ing sistem sampeyan ana rong kelas sing ngleksanakake antarmuka Excuse, lan perpustakaan karo kelas SuperStudentExcusesing ngleksanakake antarmuka StudentExcuse:
public class SuperStudentExcuse implements StudentExcuse {
   @Override
   public String generateExcuse() {
       // Логика нового функционала
       return "Невероятная отговорка, адаптированная под текущее состояние погоды, пробки or сбои в расписании общественного транспорта.";
   }

   @Override
   public void dislikeExcuse(String excuse) {
       // Добавляет причину в черный список
   }
}
Kode ora bisa diganti. Skema saiki bakal katon kaya iki: Masalah apa sing diatasi dening Adaptor - 2 desain pola?Versi sistem iki mung bisa digunakake karo antarmuka Excuse. Sampeyan ora bisa nulis maneh kode kasebut: ing aplikasi gedhe, owah-owahan kasebut bisa suwe utawa ngrusak logika aplikasi. Sampeyan bisa menehi saran ngenalake antarmuka utama lan nambah hirarki: Masalah apa sing diatasi pola desain Adaptor - 3Kanggo nindakake iki, sampeyan kudu ngganti jeneng antarmuka Excuse. Nanging hirarki tambahan ora dikarepake ing aplikasi serius: ngenalake unsur root umum ngrusak arsitektur. Sampeyan kudu ngleksanakake kelas penengah sing bakal ngidini sampeyan nggunakake fungsi anyar lan lawas karo mundhut minimal. Ing cendhak, sampeyan butuh adaptor .

Cara kerjane pola Adaptor

Adaptor minangka obyek penengah sing nggawe panggilan menyang metode ing siji obyek bisa dingerteni liyane. Ayo ngleksanakake adaptor kanggo conto kita lan sebutno Middleware. Adaptor kita kudu ngetrapake antarmuka sing kompatibel karo salah sawijining obyek. Ayo dadi Excuse. Thanks kanggo iki, Middlewarebisa nelpon cara saka obyek pisanan. Middlewarenampa telpon lan liwat menyang obyek liya ing format kompatibel. MiddlewareIki minangka implementasine metode kanthi metode generateExcuselan katon kaya 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 появятся позже
}
Testing (ing kode klien):
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()); // Адаптер вызывает адаптированный метод
   }
}
Kesimpulan:
Обычная причина для работника:
Я сегодня опоздал, потому что предпраздничное настроение замедляет метаболические процессы в моем организме и приводит к подавленному состоянию и бессоннице.
Нет оправдания моему поступку. Я недостоин этой должности. Использование нового функционала с помощью адаптера
Alasan sing luar biasa, dicocogake karo kahanan cuaca saiki, macet utawa gangguan ing jadwal transportasi umum. Cara kasebut generateExcusemung nransfer telpon menyang obyek liyane, tanpa transformasi tambahan. Cara kasebut dislikeExcusedibutuhake kanggo nyelehake alesan kasebut ing dhaptar ireng database. Pangolahan data penengah tambahan minangka alesan kenapa pola Adaptor disenengi. Nanging babagan cara likeExcusesing ana ing antarmuka Excuse, nanging ora ing StudentExcuse? Operasi iki ora didhukung ing fungsi anyar. Kanggo kasus iki, padha teka karo pangecualian UnsupportedOperationException: dibuwang yen operasi sing dijaluk ora didhukung. Ayo nganggo iki. Iki minangka implementasi kelas anyar 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.
   }
}
Sepisanan, solusi iki ora katon sukses, nanging simulasi fungsi bisa nyebabake kahanan sing luwih rumit. Yen klien enten lan adaptor uga didokumentasikake, solusi iki bisa ditampa.

Nalika nggunakake Adaptor

  1. Yen sampeyan kudu nggunakake kelas pihak katelu, nanging antarmuka ora kompatibel karo aplikasi utama. Conto ing ndhuwur nuduhake carane obyek shim digawe sing mbungkus telpon ing format dingerteni kanggo obyek target.

  2. Nalika sawetara subclass sing ana kudu duwe fungsi umum. Tinimbang subclasses tambahan (sing nggawe bakal mimpin kanggo duplikasi kode), iku luwih apik kanggo nggunakake adaptor.

Kaluwihan lan cacat

Advantage: Adaptor ndhelikake saka klien rincian pangolahan panjalukan saka siji obyek liyane. Kode klien ora mikir babagan format data utawa nangani telpon menyang metode target. Iku banget rumit, lan programer kesed :) Cacat: basis kode project rumit dening kelas tambahan, lan yen ana nomer akeh TCTerms kompatibel, nomer bisa tuwuh kanggo ukuran uncontrollable.

Ora bakal bingung karo Fasad lan Dekorator

Sawise pemeriksaan entheng, Adaptor bisa bingung karo pola Fasad lan Dekorator. Bentenipun antarane Adaptor lan Facade yaiku Facade ngenalake antarmuka anyar lan mbungkus kabeh subsistem. Ya, Dekorator, ora kaya Adaptor, ngganti obyek kasebut dhewe, dudu antarmuka.

Algoritma implementasi langkah-langkah

  1. Pisanan, priksa manawa ana masalah sing bisa diatasi kanthi pola iki.

  2. Netepake antarmuka klien atas jenenge kelas liyane sing bakal digunakake.

  3. Ngleksanakake kelas adaptor adhedhasar antarmuka sing ditetepake ing langkah sadurunge.

  4. Ing kelas adaptor, nggawe lapangan sing nyimpen referensi kanggo obyek. Referensi iki liwati ing konstruktor.

  5. Ngleksanakake kabeh cara antarmuka klien ing adaptor. Cara kasebut bisa:

    • Transfer telpon tanpa modifikasi;

    • Ngganti data, nambah / nyuda jumlah panggilan menyang metode target, luwih nggedhekake komposisi data, lsp.

    • Minangka pilihan pungkasan, yen cara tartamtu ora kompatibel, unsupportedOperationException, sing kudu didokumentasikake.

  6. Yen aplikasi nggunakake adaptor mung liwat antarmuka klien (kaya ing conto ing ndhuwur), iki bakal ngidini adaptor ditambahi painlessly ing mangsa.

Mesthine, pola desain dudu panacea kanggo kabeh penyakit, nanging kanthi bantuan sampeyan bisa ngrampungake masalah incompatibility obyek kanthi antarmuka sing beda-beda. Pangembang sing ngerti pola dhasar sawetara langkah ing ndhuwur sing mung ngerti carane nulis algoritma, amarga dibutuhake kanggo nggawe aplikasi serius. Nggunakake maneh kode dadi kurang angel lan njaga minangka kesenengan. Iku kabeh kanggo dina iki! Nanging kita bakal terus kenalan karo pola desain sing beda :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION