Тафсилоти бештар дар бораи мушкилот
Аввалан, биёед рафтори системаи кӯҳнаро тақлид кунем. Фарз мекунем, ки он сабабҳои дер мондан ба кор ё мактабро ба вуҷуд меорад. Барои ин мо интерфейс дорем,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) {
// Добавляет причину в черный список
}
}
Рамзро тағир додан мумкин нест. Нақшаи ҷорӣ чунин хоҳад буд: Ин versionи система танҳо бо интерфейси Excuse кор мекунад. Шумо рамзро аз нав навишта наметавонед: дар як замимаи калон чунин тағиротҳо метавонанд муддати тӯлонӣ гиранд ё мантиқи барномаро вайрон кунанд. Шумо метавонед пешниҳод кардани интерфейси асосӣ ва баланд бардоштани иерархияро пешниҳод кунед: Барои ин ба шумо лозим аст, ки номи интерфейсро тағир диҳед 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 қабул аст.
Адаптерро кай бояд истифода бурд
-
Агар ба шумо лозим аст, ки синфи сеюмро истифода баред, аммо интерфейси он бо барномаи асосӣ мувофиқат намекунад. Мисоли дар боло овардашуда нишон медиҳад, ки чӣ гуна an objectи shim сохта мешавад, ки зангҳоро дар формате, ки барои an objectи мавриди ҳадаф фаҳмо печонида мешавад, фаро мегирад.
-
Вақте ки якчанд зерсинфҳои мавҷуда бояд функсияҳои умумӣ дошта бошанд. Ба ҷои зерсинфҳои иловагӣ (офариниши онҳо боиси такрори code мегардад), беҳтар аст, ки адаптерро истифода баред.
Афзалиятҳо ва нуқсонҳо
Бартарӣ: Адаптер аз муштарӣ ҷузъиёти коркарди дархостҳоро аз як an object ба an objectи дигар пинҳон мекунад. Рамзи муштарӣ дар бораи формат кардани маълумот ё коркарди зангҳо ба усули мақсаднок фикр намекунад. Ин хеле мураккаб аст ва барномасозон танбал ҳастанд :) Камбудӣ: Пойгоҳи codeи лоиҳа бо синфҳои иловагӣ мураккаб аст ва агар шумораи зиёди нуқтаҳои номувофиқ вуҷуд дошта бошанд, шумораи онҳо метавонад ба андозаҳои идоранашаванда афзоиш ёбад.Набояд бо фасад ва ороишгар ошуфта шавад
Ҳангоми санҷиши сатҳӣ, адаптерро бо намунаҳои фасад ва ороишгар омехта кардан мумкин аст. Фарқи байни адаптер ва фасад дар он аст, ки фасад интерфейси навро ҷорӣ мекунад ва тамоми зерсистемаро фаро мегирад. Хуб, ороишгар, бар хилофи адаптер, худи an objectро тағир медиҳад, на интерфейс.Алгоритми амалисозии қадам ба қадам
-
Аввалан, боварӣ ҳосил кунед, ки мушкилоте вуҷуд дорад, ки ин намуна метавонад онро ҳал кунад.
-
Интерфейси муштариро муайян кунед, ки аз номи он синфи дигар истифода мешавад.
-
Татбиқи синфи адаптер дар асоси интерфейси дар қадами қаблӣ муайяншуда.
-
Дар синфи адаптер майдонеро созед, ки истинод ба an objectро нигоҳ медорад. Ин истинод дар созанда гузаронида мешавад.
-
Ҳама усулҳои интерфейси муштариро дар адаптер татбиқ кунед. Усул метавонад:
-
Интиқоли занг бидуни тағирот;
-
Тағир додани маълумот, зиёд / кам кардани шумораи зангҳо ба усули мақсаднок, минбаъд васеъ кардани таркиби маълумот ва ғайра.
-
Ҳамчун чораи охирин, агар усули мушаххас номувофиқ бошад, UnsupportedOperationException-ро партоед, ки онро ба таври қатъӣ ҳуҷҷатгузорӣ кардан лозим аст.
-
-
Агар барнома адаптерро танҳо тавассути интерфейси муштарӣ истифода барад (ба мисли мисоли боло), ин имкон медиҳад, ки адаптерҳо дар оянда бедард дароз карда шаванд.
GO TO FULL VERSION