CodeGym /Blog Jawa /Acak /Apa masalah pola desain adaptor ngatasi?
John Squirrels
tingkat
San Francisco

Apa masalah pola desain adaptor ngatasi?

Diterbitake ing grup
Pangembangan piranti lunak dadi luwih angel amarga komponen sing ora kompatibel sing kudu digarap bebarengan. Contone, yen sampeyan kudu nggabungake perpustakaan anyar karo platform lawas sing ditulis ing versi Jawa sadurungé, sampeyan bisa nemoni obyek sing ora kompatibel, utawa antarmuka sing ora kompatibel. Apa masalah pola desain adaptor ngatasi?  - 1Apa sing kudu ditindakake ing kasus iki? Tulis maneh kode? Kita ora bisa nindakake, amarga nganalisa sistem bakal njupuk akeh wektu utawa logika internal aplikasi bakal dilanggar. Kanggo ngatasi masalah iki, pola adaptor digawe. Iku mbantu obyek karo antarmuka sing ora kompatibel kanggo bisa bebarengan. Ayo padha ndeleng carane nggunakake!

Liyane babagan masalah

Kaping pisanan, kita bakal simulasi prilaku sistem lawas. Upaminipun ngasilaken alesan kanggo telat menyang kantor utawa sekolah. Kanggo nindakake iki, wis Excuseantarmuka sing wis generateExcuse(), likeExcuse()lan dislikeExcuse()cara.

public interface Excuse {
   String generateExcuse();
   void likeExcuse(String excuse);
   void dislikeExcuse(String excuse);
}
Kelas WorkExcusengleksanakake antarmuka iki:

public class WorkExcuse implements Excuse {
   private String[] excuses = {"in an incredible confluence of circumstances, I ran out of hot water and had to wait until sunlight, focused using a magnifying glass, heated a mug of water so that I could wash.",
   "the artificial intelligence in my alarm clock failed me, waking me up an hour earlier than normal. Because it is winter, I thought it was still nighttime and I fell back asleep. Everything after that is a bit hazy.",
   "my pre-holiday mood slows metabolic processes in my body, leading to depression and insomnia."};
   private String [] apologies = {"This will not happen again, of course. I'm very sorry.", "I apologize for my unprofessional behavior.", "There is no excuse for my actions. I am not worthy of this position."};

   @Override
   public String generateExcuse() { // Randomly select an excuse from the array
       String result = "I was late today because " + excuses[(int) Math.round(Math.random() + 1)] + "\\n" +
               apologies[(int) Math.round(Math.random() + 1)];
       return result;
   }

   @Override
   public void likeExcuse(String excuse) {
       // Duplicate the element in the array so that its chances of being chosen are higher
   }

   @Override
   public void dislikeExcuse(String excuse) {
       // Remove the item from the array
   }
}
Ayo nyoba conto kita:

Excuse excuse = new WorkExcuse();
System.out.println(excuse.generateExcuse());
Output:

"I was late today because my pre-holiday mood slows metabolic processes in my body, leading to depression and insomnia.
I apologize for my unprofessional behavior.
Saiki bayangake yen sampeyan wis ngluncurake layanan sing nggawe alesan, nglumpukake statistik, lan ngerteni manawa umume pangguna sampeyan yaiku mahasiswa. Kanggo nglayani grup iki kanthi luwih apik, sampeyan njaluk pangembang liyane kanggo nggawe sistem sing nggawe alesan khusus kanggo mahasiswa universitas. Tim pangembang nganakake riset pasar, alasan peringkat, nyambungake sawetara intelijen buatan, lan nggabungake layanan kasebut karo laporan lalu lintas, laporan cuaca, lan liya-liyane. Saiki sampeyan duwe perpustakaan kanggo nggawe alesan kanggo mahasiswa universitas, nanging wis antarmuka beda StudentExcuse:.

public interface StudentExcuse {
   String generateExcuse();
   void dislikeExcuse(String excuse);
}
Antarmuka iki nduweni rong cara: generateExcuse, sing ngasilake alesan, lan dislikeExcuse, sing nyegah alesan kasebut katon maneh ing mangsa ngarep. Pustaka pihak katelu ora bisa diowahi, yaiku sampeyan ora bisa ngganti kode sumber. Saiki kita duwe sistem karo rong kelas sing ngleksanakake antarmuka Excuse, lan perpustakaan karo SuperStudentExcusekelas sing ngleksanakake StudentExcuseantarmuka:

public class SuperStudentExcuse implements StudentExcuse {
   @Override
   public String generateExcuse() {
       // Logic for the new functionality
       return "An incredible excuse adapted to the current weather conditions, traffic jams, or delays in public transport schedules.";
   }

   @Override
   public void dislikeExcuse(String excuse) {
       // Adds the reason to a blacklist
   }
}
Kode ora bisa diganti. Hierarki kelas saiki katon kaya iki: Apa masalah pola desain adaptor ngatasi?  - 2Versi sistem iki mung bisa digunakake karo antarmuka Excuse. Sampeyan ora bisa nulis maneh kode kasebut: ing aplikasi gedhe, pangowahan kasebut bisa dadi proses sing dawa utawa ngrusak logika aplikasi. Kita bisa ngenalake antarmuka dhasar lan nggedhekake hirarki: Apa masalah pola desain adaptor ngatasi?  - 3Kanggo nindakake iki, kita kudu ngganti jeneng Excuseantarmuka. Nanging hirarki ekstra ora dikarepake ing aplikasi serius: ngenalake unsur root umum ngrusak arsitektur. Sampeyan kudu ngetrapake kelas penengah sing ngidini kita nggunakake fungsi anyar lan lawas kanthi kerugian minimal. Ing cendhak, sampeyan butuh adaptor .

Prinsip konco pola adaptor

Adaptor minangka obyek penengah sing ngidini cara nelpon siji obyek bisa dimangerteni dening liyane. Ayo ngleksanakake adaptor kanggo conto kita lan sebutno Middleware. Adaptor kita kudu ngetrapake antarmuka sing kompatibel karo salah sawijining obyek. Ayo dadi Excuse. Iki ngidini Middlewarekanggo nelpon cara obyek pisanan. Middlewarenampa telpon lan diterusake kanthi cara sing cocog menyang obyek liya. Mangkene implementasine Middlewarekanthi metode generateExcuselan dislikeExcuse:

public class Middleware implements Excuse { // 1. Middleware becomes compatible with WorkExcuse objects via the Excuse interface

   private StudentExcuse superStudentExcuse;

   public Middleware(StudentExcuse excuse) { // 2. Get a reference to the object being adapted
       this.superStudentExcuse = excuse;
   }

   @Override
   public String generateExcuse() {
       return superStudentExcuse.generateExcuse(); // 3. The adapter implements an interface method
   }

    @Override
    public void dislikeExcuse(String excuse) {
        // The method first adds the excuse to the blacklist,
        // Then passes it to the dislikeExcuse method of the superStudentExcuse object.
    }
   // The likeExcuse method will appear later
}
Testing (ing kode klien):

public class Test {
   public static void main(String[] args) {
       Excuse excuse = new WorkExcuse(); // We create objects of the classes
       StudentExcuse newExcuse = new SuperStudentExcuse(); // that must be compatible.
       System.out.println("An ordinary excuse for an employee:");
       System.out.println(excuse.generateExcuse());
       System.out.println("\n");
       Excuse adaptedStudentExcuse = new Middleware(newExcuse); // Wrap the new functionality in the adapter object
       System.out.println("Using new functionality with the adapter:");
       System.out.println(adaptedStudentExcuse.generateExcuse()); // The adapter calls the adapted method
   }
}
Output:

An ordinary excuse for an employee:
I was late today because my pre-holiday mood slows metabolic processes in my body, leading to depression and insomnia.
There is no excuse for my actions. I am not worthy of this position. Using new functionality with the adapter:
Alasan sing luar biasa sing dicocogake karo kahanan cuaca saiki, macet, utawa telat jadwal transportasi umum. Cara kasebut generateExcusemung ngirim telpon menyang obyek liyane, tanpa owah-owahan tambahan. Cara kasebut dislikeExcusembutuhake kita nggawe dhaptar ireng dhisik. Kemampuan kanggo nindakake pangolahan data penengah minangka alesan kenapa wong seneng karo pola adaptor. Nanging babagan likeExcusecara, yaiku bagean saka Excuseantarmuka nanging dudu bagean saka StudentExcuseantarmuka? Fungsi anyar ora ndhukung operasi iki. Ing iki UnsupportedOperationExceptionnemokke kanggo kahanan iki. Dibuwang yen operasi sing dijaluk ora didhukung. Ayo nganggo. Mangkene carane Middlewareimplementasine kelas anyar katon:

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("The likeExcuse method is not supported by the new functionality");
   }

   @Override
   public void dislikeExcuse(String excuse) {
       // The method accesses a database to fetch additional information,
       // and then passes it to the superStudentExcuse object's dislikeExcuse method.
   }
}
Sepisanan, solusi iki katon ora apik, nanging niru fungsi kasebut bisa nggawe kahanan rumit. Yen klien menehi perhatian, lan adaptor wis didokumentasikake kanthi apik, solusi kasebut bisa ditampa.

Nalika nggunakake adaptor

  1. Nalika sampeyan kudu nggunakake kelas pihak katelu, nanging antarmuka ora kompatibel karo aplikasi utama. Conto ing ndhuwur nuduhake carane nggawe obyek adaptor sing mbungkus telpon ing format sing obyek target bisa ngerti.

  2. Nalika sawetara subclass sing ana butuh sawetara fungsi umum. Tinimbang nggawe subclass tambahan (sing bakal nyebabake duplikasi kode), luwih becik 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 :) Kakurangan: Basis kode proyek rumit dening kelas tambahan. Yen sampeyan duwe akeh antarmuka sing ora kompatibel, jumlah kelas tambahan bisa dadi ora bisa diatur.

Aja bingung adaptor karo fasad utawa dekorator

Kanthi mung inspeksi sing entheng, adaptor bisa bingung karo pola fasad lan dekorator. Bentenipun antarane adaptor lan fasad yaiku fasad ngenalake antarmuka anyar lan mbungkus kabeh subsistem. Lan dekorator, ora kaya adaptor, ngganti obyek kasebut dhewe tinimbang antarmuka.

Algoritma langkah-langkah

  1. Pisanan, manawa sampeyan duwe masalah sing bisa diatasi kanthi pola iki.

  2. Netepake antarmuka klien sing bakal digunakake kanggo interaksi ora langsung karo obyek sing ora kompatibel.

  3. Nggawe kelas adaptor warisan antarmuka ditetepake ing langkah sadurunge.

  4. Ing kelas adaptor, nggawe lapangan kanggo nyimpen referensi kanggo obyek adaptee. Referensi iki diterusake menyang konstruktor.

  5. Ngleksanakake kabeh cara antarmuka klien ing adaptor. Metode bisa:

    • Terusake telpon tanpa owah-owahan

    • Ngowahi utawa nambah data, nambah / nyuda nomer telpon menyang cara target, etc.

    • Ing kasus nemen, yen cara tartamtu tetep ora kompatibel, unsupportedOperationException. Operasi sing ora didhukung kudu didokumentasikake kanthi ketat.

  6. Yen aplikasi mung nggunakake kelas adaptor liwat antarmuka klien (kaya ing conto ing ndhuwur), banjur adaptor bisa painlessly ditambahi ing mangsa.

Mesthine, pola desain iki dudu panacea kanggo kabeh penyakit, nanging bisa mbantu sampeyan ngrampungake masalah ketidakcocokan antarane obyek kanthi antarmuka sing beda-beda. Pangembang sing ngerti pola dhasar sawetara langkah luwih dhisik tinimbang sing mung ngerti carane nulis algoritma, amarga pola desain dibutuhake kanggo nggawe aplikasi serius. Gunakake maneh kode ora angel, lan pangopènan dadi nyenengake. Iku kabeh kanggo dina iki! Nanging kita bakal terus ngerteni macem-macem pola desain :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION