JavaRush /Java Blog /Random-TK /Adapter dizaýn nagşy haýsy meseleleri çözýär?

Adapter dizaýn nagşy haýsy meseleleri çözýär?

Toparda çap edildi
Programma üpjünçiligini ösdürmek köplenç biri-biri bilen işleýän komponentleriň arasyndaky laýyk gelmezlik bilen çylşyrymlaşýar. Mysal üçin, täze kitaphanany Java-yň öňki wersiýalarynda ýazylan köne platforma bilen birleşdirmek zerur bolsa, obýektleriň, has dogrusy, interfeýsleriň gabat gelmezligi bilen ýüzbe-ýüz bolup bilersiňiz. Bu ýagdaýda näme etmeli? Kody täzeden ýazyň? Emma bu mümkin däl: ulgamy seljermek köp wagt alar ýa-da işiň içerki logikasy bozular. Adapter dizaýn nagşy haýsy meseleleri çözýär - 1Bu meseläni çözmek üçin, gabat gelmeýän interfeýsli obýektleriň bilelikde işlemegine kömek edýän Adapter nagşyny tapdylar. Nädip ulanmalydygyny göreliň!

Mesele barada has giňişleýin maglumat

Ilki bilen, köne ulgamyň özüni alyp barşyny simulasiýa edeliň. Işe ýa-da mekdebe gijä galmagyň sebäplerini döredeliň diýeliň. Munuň üçin Excuseusullary öz içine alýan interfeýs bar generateExcuse()we likeExcuse().dislikeExcuse()
public interface Excuse {
   String generateExcuse();
   void likeExcuse(String excuse);
   void dislikeExcuse(String excuse);
}
Bu interfeýs synp tarapyndan amala aşyrylýar 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) {
       // Удаляем элемент из массива
   }
}
Mysal synap göreliň:
Excuse excuse = new WorkExcuse();
System.out.println(excuse.generateExcuse());
Netije:
Я сегодня опоздал, потому что предпраздничное настроение замедляет метаболические процессы в моем организме и приводит к подавленному состоянию и бессоннице. 
Прошу меня извинить за непрофессиональное поведение.
Indi hyzmaty başlandygyňyzy, statistika ýygnandygyňyzy we hyzmat ulanyjylaryň köpüsiniň uniwersitet talyplarydygyny göz öňüne getireliň. Bu toparyň zerurlyklary üçin ony gowulandyrmak üçin, başga bir işläp düzüjiden bahana öndürmek ulgamyny sargyt etdiňiz. Ösüş topary gözleg geçirdi, reýtingleri düzdi, emeli intellekt birikdirdi, dyknyşyklar, howa we ş.m. Indi okuwçylar üçin bahana döretmek üçin kitaphanaňyz bar, ýöne onuň bilen täsirleşmegiň interfeýsi başga - StudentExcuse:
public interface StudentExcuse {
   String generateExcuse();
   void dislikeExcuse(String excuse);
}
Interfeýsiň iki usuly bar: generateExcusebahana döredýän we dislikeExcusegelejekde görünmezligi üçin bahana ýapýan. Üçünji tarap kitaphanasy redaktirlemek üçin ýapyk - deslapky kody üýtgedip bilmersiňiz. Netijede, ulgamyňyzda interfeýsi amala aşyrýan iki synp we interfeýsi amala aşyrýan Excusesynply kitaphana bar : SuperStudentExcuseStudentExcuse
public class SuperStudentExcuse implements StudentExcuse {
   @Override
   public String generateExcuse() {
       // Логика нового функционала
       return "Невероятная отговорка, адаптированная под текущее состояние погоды, пробки or сбои в расписании общественного транспорта.";
   }

   @Override
   public void dislikeExcuse(String excuse) {
       // Добавляет причину в черный список
   }
}
Kod üýtgedilip bilinmez Häzirki shema şeýle bolar: Adapter - 2 dizaýn nagşy haýsy meseleleri çözýär?Ulgamyň bu wersiýasy diňe “Excuse” interfeýsi bilen işleýär. Kody täzeden ýazyp bilmersiňiz: uly programmada şeýle üýtgeşmeler köp wagt alyp biler ýa-da programma logikasyny bozup biler. Esasy interfeýsi girizmegi we iýerarhiýany köpeltmegi teklip edip bilersiňiz: Adapter dizaýn nagşy haýsy meseleleri çözýär - 3Munuň üçin interfeýsiň adyny üýtgetmeli Excuse. Seriousöne çynlakaý programmalarda goşmaça iýerarhiýa islenmeýär: umumy kök elementini girizmek arhitekturany bozýar. Iň az ýitgi bilen täze we köne funksiýalary ulanmaga mümkinçilik berýän orta synp durmuşa geçirilmelidir. Gysgaça aýdanyňda, adapter gerek .

Adapter nagşynyň işleýşi

Adapter, bir obýektdäki usullara beýlekisine düşnükli edýän aralyk obýektdir. Mysal üçin adapteri durmuşa geçireliň we oňa jaň edeliň Middleware. Adapterimiz obýektleriň birine gabat gelýän interfeýsi durmuşa geçirmeli. Goý, bolsun Excuse. Munuň netijesinde Middlewareilkinji obýektiň usullaryny çagyryp biler. Middlewarejaňlary kabul edýär we gabat gelýän formatda ikinji obýekte geçirýär. MiddlewareUsullar bilen usulyň durmuşa geçirilişi generateExcusewe görnüşi 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 появятся позже
}
Synag (müşderi kody bilen):
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()); // Адаптер вызывает адаптированный метод
   }
}
Netije:
Обычная причина для работника:
Я сегодня опоздал, потому что предпраздничное настроение замедляет метаболические процессы в моем организме и приводит к подавленному состоянию и бессоннице.
Нет оправдания моему поступку. Я недостоин этой должности. Использование нового функционала с помощью адаптера
Häzirki howa şertlerine, ulag dyknyşyklaryna ýa-da jemgyýetçilik ulaglarynyň tertibindäki bökdençliklere uýgunlaşdyrylan ajaýyp bahana. Usul, generateExcusegoşmaça üýtgeşmeler bolmazdan, jaňy başga bir obýekte geçirýär. Bu usul dislikeExcuseilki bilen bahana bazasynyň gara sanawyna ýerleşdirilmegini talap etdi. Goşmaça aralyk maglumatlary gaýtadan işlemek Adapter nagşynyň halanmagynyň sebäbi. likeExcuseTheöne interfeýsde bar Excuse, ýöne ýok bolan usul hakda näme aýdyp bilersiňiz StudentExcuse? Bu amal täze funksiýada goldanylmaýar. Şeýle ýagdaý üçin kadadan çykma tapdylar UnsupportedOperationException: talap edilýän amal goldanylmasa zyňylýar. Geliň muny ulanalyň. Täze synpyň durmuşa geçirilişi şu 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.
   }
}
Bir seretseň, bu çözgüt üstünlikli ýaly görünmeýär, ýöne işlemegi simulirlemek has çylşyrymly ýagdaýa getirip biler. Müşderi ünsli bolsa we adapter gowy resminamalaşdyrylan bolsa, bu çözgüt kabul ederliklidir.

Adapteri haçan ulanmaly

  1. Üçünji tarap synpyny ulanmaly bolsaňyz, ýöne onuň interfeýsi esasy programma bilen gabat gelmeýär. Aboveokardaky mysal, çagyryşlary maksatly obýekte düşnükli formatda gurşap alýan parlak obýektiň nädip döredilendigini görkezýär.

  2. Haçan-da birnäçe bar bolan kiçi klaslaryň umumy işlemegi bolmaly. Goşmaça kiçi klasslaryň ýerine (olaryň döredilmegi kodlaryň köpelmegine getirer) adapteri ulanmak has gowudyr.

Üstünlikleri we kemçilikleri

Üstünligi: Adapter bir obýektden beýlekisine haýyşlary gaýtadan işlemegiň jikme-jikliklerini müşderiden gizleýär. Müşderi kody maglumatlary formatlamak ýa-da maksatly usula jaňlary dolandyrmak hakda pikir etmeýär. Bu gaty çylşyrymly we programmistler ýalta :) adetmezçiligi: Taslamanyň kod bazasy goşmaça synplar bilen çylşyrymlaşdyrylýar we köp sanly gabat gelmeýän nokatlar bar bolsa, olaryň sany gözegçiliksiz ululyklara çenli artyp biler.

Fasad we bezeg bilen garyşmaly däl

Superüzleý gözden geçirilenden soň, Adapteri Fasad we bezeg nagyşlary bilen bulaşdyryp bolar. Adapter bilen fasadyň arasyndaky tapawut, “Facade” täze interfeýs girizýär we tutuş kiçi ulgamy gurşap alýar. Dogrusy, Bezegçi, Adapterden tapawutlylykda, interfeýsi däl-de, obýektiň özüni üýtgedýär.

Stepdimme-ädim durmuşa geçirmek algoritmi

  1. Ilki bilen, bu nagşyň çözüp biljek meselesiniň bardygyna göz ýetiriň.

  2. Başga bir synpyň ulanyljak müşderi interfeýsini kesgitläň.

  3. Öňki ädimde kesgitlenen interfeýs esasynda adapter synpyny durmuşa geçiriň.

  4. Adapter synpynda obýekte salgylanma saklaýan meýdan düzüň. Bu salgylanma konstruktorda berilýär.

  5. Adapterde ähli müşderi interfeýs usullaryny durmuşa geçiriň. Usul edip biler:

    • Çagyryşy üýtgetmän geçiriň;

    • Maglumatlary üýtgetmek, maksatly usula jaňlaryň sanyny köpeltmek / azaltmak, maglumatlaryň düzümini hasam giňeltmek we ş.m.

    • Iň soňky ýol hökmünde, belli bir usul biri-birine gabat gelmeýän bolsa, resminamalaşdyrylmaly berk goldaw berilmeýän operasiýa ekspressionini taşlaň.

  6. Programma adapteri diňe müşderi interfeýsi arkaly ulanýan bolsa (ýokardaky mysaldaky ýaly), bu adapterleriň geljekde agyrysyz uzalmagyna mümkinçilik döreder.

Elbetde, dizaýn nagşy ähli keseller üçin howsala däl, ýöne onuň kömegi bilen dürli interfeýsli obýektleriň gabat gelmezlik meselesini sypaýy çözüp bilersiňiz. Esasy nagyşlary bilýän dörediji, algoritmleri nädip ýazmalydygyny bilýänlerden birnäçe ädim ýokary, sebäbi çynlakaý programmalar döretmek üçin zerurdyr. Kody gaýtadan ulanmak kynlaşýar we saklamak hezil. Bularyň hemmesi şu gün üçin! Soonöne ýakyn wagtda dürli dizaýn nagyşlary bilen tanyşlygymyzy dowam etdireris :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION