JavaRush /Блоги Java /Random-TG /Намунаи тарроҳии адаптер кадом мушкилотро ҳал мекунад?

Намунаи тарроҳии адаптер кадом мушкилотро ҳал мекунад?

Дар гурӯҳ нашр шудааст
Таҳияи нармафзор аксар вақт аз сабаби номувофиқатии ҷузъҳое, ки бо ҳамдигар кор мекунанд, душвор аст. Масалан, агар ба шумо лозим аст, ки китобхонаи навро бо платформаи кӯҳнае, ки дар versionҳои қаблии Java навишта шудааст, ҳамҷоя кунед, шумо метавонед ба номувофиқатии an objectҳо, аниқтараш интерфейсҳо дучор шавед. Дар ин ҳолат чӣ бояд кард? Рамзро аз нав нависед? Аммо ин имконнопазир аст: тахлor система вакти зиёдеро мегирад ё мантики дохorи кор вайрон мешавад. Намунаи тарроҳии адаптер кадом мушкилотро ҳал мекунад - 1Барои ҳалли ин мушкилот онҳо намунаи адаптерро таҳия карданд, ки ба an objectҳои интерфейсҳои номувофиқ дар якҷоягӣ кӯмак мекунад. Биёед бубинем, ки чӣ тавр онро истифода барем!

Тафсилоти бештар дар бораи мушкилот

Аввалан, биёед рафтори системаи кӯҳнаро тақлид кунем. Фарз мекунем, ки он сабабҳои дер мондан ба кор ё мактабро ба вуҷуд меорад. Барои ин мо интерфейс дорем, 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) {
       // Добавляет причину в черный список
   }
}
Рамзро тағир додан мумкин нест. Нақшаи ҷорӣ чунин хоҳад буд: Намунаи тарроҳии Adapter - 2 кадом мушкилотро ҳал мекунад?Ин versionи система танҳо бо интерфейси Excuse кор мекунад. Шумо рамзро аз нав навишта наметавонед: дар як замимаи калон чунин тағиротҳо метавонанд муддати тӯлонӣ гиранд ё мантиқи барномаро вайрон кунанд. Шумо метавонед пешниҳод кардани интерфейси асосӣ ва баланд бардоштани иерархияро пешниҳод кунед: Намунаи тарроҳии адаптер кадом мушкилотро ҳал мекунад - 3Барои ин ба шумо лозим аст, ки номи интерфейсро тағир диҳед Excuse. Аммо иерархияи иловагӣ дар барномаҳои ҷиддӣ номатлуб аст: ҷорӣ намудани унсури решаи умумӣ меъмориро вайрон мекунад. Синфи мобайнӣ бояд амалӣ карда шавад, ки имкон медиҳад, ки функсияҳои нав ва кӯҳна бо талафоти кам истифода шаванд. Хулоса, ба шумо адаптер лозим аст .

Намунаи адаптер чӣ гуна кор мекунад

Адаптер an objectи фосилавӣ мебошад, ки зангҳоро ба усулҳои як an object ба дигараш фаҳмо месозад. Биёед адаптерро барои мисоли худ татбиқ кунем ва онро даъват кунем Middleware. Адаптери мо бояд интерфейсеро амалӣ созад, ки бо яке аз an objectҳо мувофиқ бошад. Бигзор шавад Excuse. Ба шарофати ин, Middlewareон метавонад усулҳои an objectи аввалро даъват кунад. Middlewareзангҳоро қабул мекунад ва онҳоро ба an objectи дуюм дар формати мувофиқ мефиристад. 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 появятся позже
}
Санҷиш (дар codeи муштарӣ):
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зангро ба an objectи дигар бидуни тағироти иловагӣ интиқол медиҳад. Усули 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.
   }
}
Дар назари аввал, ин ҳалли муваффақ ба назар намерасад, аммо тақлид кардани функсия метавонад ба вазъияти мураккабтар оварда расонад. Агар муштарӣ бодиққат бошад ва адаптер хуб ҳуҷҷатгузорӣ шуда бошад, ин ҳалли қобor қабул аст.

Адаптерро кай бояд истифода бурд

  1. Агар ба шумо лозим аст, ки синфи сеюмро истифода баред, аммо интерфейси он бо барномаи асосӣ мувофиқат намекунад. Мисоли дар боло овардашуда нишон медиҳад, ки чӣ гуна an objectи shim сохта мешавад, ки зангҳоро дар формате, ки барои an objectи мавриди ҳадаф фаҳмо печонида мешавад, фаро мегирад.

  2. Вақте ки якчанд зерсинфҳои мавҷуда бояд функсияҳои умумӣ дошта бошанд. Ба ҷои зерсинфҳои иловагӣ (офариниши онҳо боиси такрори code мегардад), беҳтар аст, ки адаптерро истифода баред.

Афзалиятҳо ва нуқсонҳо

Бартарӣ: Адаптер аз муштарӣ ҷузъиёти коркарди дархостҳоро аз як an object ба an objectи дигар пинҳон мекунад. Рамзи муштарӣ дар бораи формат кардани маълумот ё коркарди зангҳо ба усули мақсаднок фикр намекунад. Ин хеле мураккаб аст ва барномасозон танбал ҳастанд :) Камбудӣ: Пойгоҳи codeи лоиҳа бо синфҳои иловагӣ мураккаб аст ва агар шумораи зиёди нуқтаҳои номувофиқ вуҷуд дошта бошанд, шумораи онҳо метавонад ба андозаҳои идоранашаванда афзоиш ёбад.

Набояд бо фасад ва ороишгар ошуфта шавад

Ҳангоми санҷиши сатҳӣ, адаптерро бо намунаҳои фасад ва ороишгар омехта кардан мумкин аст. Фарқи байни адаптер ва фасад дар он аст, ки фасад интерфейси навро ҷорӣ мекунад ва тамоми зерсистемаро фаро мегирад. Хуб, ороишгар, бар хилофи адаптер, худи an objectро тағир медиҳад, на интерфейс.

Алгоритми амалисозии қадам ба қадам

  1. Аввалан, боварӣ ҳосил кунед, ки мушкилоте вуҷуд дорад, ки ин намуна метавонад онро ҳал кунад.

  2. Интерфейси муштариро муайян кунед, ки аз номи он синфи дигар истифода мешавад.

  3. Татбиқи синфи адаптер дар асоси интерфейси дар қадами қаблӣ муайяншуда.

  4. Дар синфи адаптер майдонеро созед, ки истинод ба an objectро нигоҳ медорад. Ин истинод дар созанда гузаронида мешавад.

  5. Ҳама усулҳои интерфейси муштариро дар адаптер татбиқ кунед. Усул метавонад:

    • Интиқоли занг бидуни тағирот;

    • Тағир додани маълумот, зиёд / кам кардани шумораи зангҳо ба усули мақсаднок, минбаъд васеъ кардани таркиби маълумот ва ғайра.

    • Ҳамчун чораи охирин, агар усули мушаххас номувофиқ бошад, UnsupportedOperationException-ро партоед, ки онро ба таври қатъӣ ҳуҷҷатгузорӣ кардан лозим аст.

  6. Агар барнома адаптерро танҳо тавассути интерфейси муштарӣ истифода барад (ба мисли мисоли боло), ин имкон медиҳад, ки адаптерҳо дар оянда бедард дароз карда шаванд.

Албатта, намунаи тарроҳӣ барои ҳама бемориҳо як даво нест, аммо бо ёрии он шумо метавонед мушкилоти номувофиқатии an objectҳоро бо интерфейсҳои гуногун ҳал кунед. Таҳиягаре, ки намунаҳои асосиро медонад, чанд зина болотар аз онҳое аст, ки чӣ гуна алгоритмҳоро навиштанро медонанд, зеро онҳо барои эҷоди барномаҳои ҷиддӣ лозиманд. Истифодаи такрории code душвортар мегардад ва нигоҳдорӣ як лаззат аст. Ин ҳама барои имрӯз аст! Аммо мо ба наздикӣ шиносоии худро бо намунаҳои гуногуни тарроҳӣ идома медиҳем :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION