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ň üçinExcuse
usullary ö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: generateExcuse
bahana döredýän we dislikeExcuse
gelejekde 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 Excuse
synply kitaphana bar : SuperStudentExcuse
StudentExcuse
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: 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: Munuň üç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 Middleware
ilkinji obýektiň usullaryny çagyryp biler. Middleware
jaňlary kabul edýär we gabat gelýän formatda ikinji obýekte geçirýär. Middleware
Usullar bilen usulyň durmuşa geçirilişi generateExcuse
we 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, generateExcuse
goşmaça üýtgeşmeler bolmazdan, jaňy başga bir obýekte geçirýär. Bu usul dislikeExcuse
ilki bilen bahana bazasynyň gara sanawyna ýerleşdirilmegini talap etdi. Goşmaça aralyk maglumatlary gaýtadan işlemek Adapter nagşynyň halanmagynyň sebäbi. likeExcuse
Theö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
-
Üçü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.
-
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
-
Ilki bilen, bu nagşyň çözüp biljek meselesiniň bardygyna göz ýetiriň.
-
Başga bir synpyň ulanyljak müşderi interfeýsini kesgitläň.
-
Öňki ädimde kesgitlenen interfeýs esasynda adapter synpyny durmuşa geçiriň.
-
Adapter synpynda obýekte salgylanma saklaýan meýdan düzüň. Bu salgylanma konstruktorda berilýär.
-
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ň.
-
-
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.
GO TO FULL VERSION