Изложен образац дизајна: Стратешки образац



На овом блогу ћемо открити образац дизајна стратегије који се користи за стварање заменљиве породице алгоритама који се могу динамички бирати.

'

Добродошли у први пост серије „Изложени узорци дизајна“. У овој серији ћемо открити сваки образац дизајна од нуле.





Једноставно познавање програмског језика и његових конструкција неће вас учинити бољим програмера или програмера. Потребно је знање о дизајнерским узорцима да би се креирао софтвер који ће радити данас, али иу будућности.

Многи програмери су се већ сусрели са оним проблемима у дизајну са којима сте суочени тренутно или ћете се суочити у будућности. Они су одредили стандардни начин решавања тог проблема. Дакле, коришћењем образаца дизајна добијате предност коришћења доказаних техника.



Сваки образац дизајна служи за решавање одређене врсте ситуације. Може постојати ситуација у којој се може користити више од једног узорка дизајна.

Већина програмера само покушава да реши проблем са којим се суочавају не трудећи се око дизајнерских образаца, сувишног кода или чак уског споја. Али добри програмери почињу другачије. Они размишљају о данашњим захтевима, будућим захтевима, одржавању кода и поновној употребљивости кода.

Добри програмери не журе с започињањем кодирања када добију захтеве. Они седе и размишљају о проблему да ли ће њихов дизајн успети. Ако је одговор да, да ли ће то функционисати након 6 месеци, када ће се захтеви променити.



Добри програмери узимају оловку и папир и почињу да дизајнирају часове и однос између класа. Покушавају да постигну лабаву спрегу и високу кохезију у свом дизајну, док раде све то, а имају у виду Објектно оријентисане принципе. Не улазе одмах у код ниског нивоа. Да бисте дизајнирали флексибилни софтвер за вишекратну употребу, требало би да следите овај приступ, у супротном ћете увек наћи себе како мењате код који сте раније написали.

Само је једна ствар константна у индустрији софтвера, а то је Промена. Захтеви ће се сигурно мењати. Па како да дизајнирамо софтвер који ваш код може лако прилагодити будућим захтевима? За то морате започети рано и дизајнирати га тако да будући захтеви не наруше ваш претходни код.

Како могу да урадим?

Па, то се може урадити пратећи принципе дизајна и обрасце дизајна засноване на тим принципима.

Сада, заронимо у кодирање и започните путовање да бисте постали бољи програмер. У овом посту ћемо открити један од најважнијих образаца - Стратешки образац .

Кад кажем најважније, то се одражава на заједнички проблем који се решава стратегијским обрасцем.

Шта је образац стратегије?

Ево дефиниције директно из књиге „Банда четворке“: „Образац стратегије користи се за стварање заменљиве породице алгоритама из којих се у току извођења бира потребан процес”.

У случају да јестене могу да разумем, не брините, објаснићемо то у аједноставнијеначинза тебе Такођеразумети.

Прво да схватимо проблем, а затим ћемо видети како Стратешки образац то може решити.

У горњем УМЛ дијаграму имамо класу Анимал абстрацт и две конкретне класе, Дог и Бирд, која се протежу од супер класе Анимал.

Дакле, дефинишемо класу апстрактних животиња и две конкретне класе, пас и птица.

Шта мислите о горе наведеном дизајну? У нашем дизајну постоји једна велика грешка.

Све животиње не могу да лете, као у горе наведеном случају пас не може да лети. Али ипак има понашање „муве“.

Погрешили смо написавши апстрактну методу фли () унутар класе Анимал. Овај дизајн ће приморати сваку подкласу Пас, Птица, Пингвин, Крокодил, Гуска итд. Да примени методу фли ().

Требали смо схватити да је летење способност коју неће имати све животиње. Пружањем методе фли () у класу Анимал абстрацт ми смо поставили способност летења у све подкласе, што није тачно за све подкласе животиња.

Можда мислите да је проблем у примени методе летења у подкласе. Иако методу фли () можете применити у не-летећим подразредима Животиња да бисте само исписали „Не могу да летим“. Али проблем је у томе што још увек понашате муху према нелетачким животињама. Ово није тачно.

Какав је осећај назвати дог.фли () или цроцодиле.фли ().

Дакле, сада смо схватили да наш дизајн није тачан и требало би да уклонимо методу фли () из подкласе Анимал.

Који је други начин дизајнирања наших класа на начин да наш дизајн не намеће све подразреде животиња да се понашају мушице.

Једно решење које нам одмах падне на памет је да можемо направити летећи интерфејс користећи метод летења и само ће животиње које могу летети применити тај летећи интерфејс. На овај начин нећемо применити све подкласе животиња да дефинишу понашање мухе. Па кодирајмо овај приступ дизајну.

Сада ће наша класа Анимал изгледати попут доњег кода након уклањања методе фли из класе Анимал.

Хајде сада да дефинишемо Летећи интерфејс

Сада ће се променити класа пасакао штокод испод и не мора да се понаша у лету.

Погледајмо неке од наших подкласа Животиње које ће се понашати летеће.

Решили смо свој претходни проблем, али смо упали у нову невољу, а то је „Дуплирање кода“.

Рецимо, имаћемо 100 различитих под-класа летећих животиња. Морамо да дуплирамо код за понашање лета јер летачки интерфејс не може да обезбеди никакву примену за понашање лета, а касније ако желимо да променимо примену методе фли () у било којој поткласи, мораћемо да отворимо ту класу и променимо код што је лоше. Недостаје нам нешто велико и, то јест, не можемо променити летеће понашање класе у време извођења.

Али не брините, Стратешки образац је ту да вас извуче из овог проблема.

шта је вишеструко наслеђивање у јави

Дакле, хајде да преобликујемо наш код тако да користи образац стратегије.

Летећи интерфејс остаће исти какав је. Сада ћемо уместо да свака летећа подкласа која имплементира сам летећи интерфејс дефинисати одвојене конкретне класе које ће применити различито понашање летења. Да видимо како то учинити.

Па, како то све функционише, погледајмо ТестЦласс

Коришћењем Стратешког обрасца сада смо у стању да променимо понашање летења било које животиње у време извођења, и то без наметања било каквих поткласа да специфицирамо само понашање лета.

Када користити образац стратегије?

Када желите да можете динамички да промените понашање током извођења.

Да бисмо били сигурни да јасно разумете образац стратегије, узмимо још један пример.

У горњој класи Запослени одређујемо зараду запосленог у зависности од његове / њене намене. Ако је запосленик „приправник“, додајемо 10% бонуса на основну плату да бисмо израчунали стварну плату.

Ако је запослени „веб програмер“, додајемо 20% бонуса на основну плату да бисмо израчунали стварну плату, а сличан поступак следи и за друге типове запослених. Иако је наш алгоритам за израчунавање стварне зараде врло једноставан ради лакшег разумевања, али већину времена, укључује мноштво поређења и израчунавања.

Па, шта није у реду са кодом класе запослених?

Па, код за израчунавање зараде (гетПаи ()) је статичан. Претпоставимо да желим да променим бонус за „приправника“ са 10% на 14%. Мораћу да отворим код класе запосленика и променим га.

И још један проблем је што не могу да променим алгоритам за плату запосленог у току. Па, како то учинити? Образац стратегије се посебно користи за решавање ове врсте проблема.

Рефакторизирамо код да бисмо користили образац стратегије.

Дефинисаћу неколико алгоритама за израчунавање зараде. Тада ћу моћи да користим било који од ових алгоритама за израчунавање зараде у току.

Сада, да видимо како ће се променити час запослених.

Белешка: Уклонио сам логику обрачуна плата из класе Запослени и створио постављену методу ПаиАлгоритхм () помоћу које ћу поставити ПаиАлгоритхм који желим да користим за обрачун зараде.

Ово ће ми дати флексибилност за израчунавање исплате навођењем било ког ПаиАлгоритхм-а динамички током времена извршавања. Такође имајте на уму да касније, ако морам да променим логику обрачуна зараде, могу да креирам нови ПаиАлгоритхм и да га користим за израчунавање исплате. Не треба да мењам претходни код, зар не?

Па да видимо како то функционише.

Надам се да сте одлично разумели образац стратегије. Најбољи начин да се нешто научи је вежбање.

У случају да имате било каква питања која се односе на Стратешки образац или било који други образац, оставите своја питања у наставку.

Пазите на следећи пост, где ћемо открити један од најпопуларнијих дизајнерских образаца, Фацтори Паттерн.

До тада можете преузети код који се поиграва са њим и обавезно зацементирати Стратешки образац у својој глави.

Имате питање за нас? Спомените их у одељку за коментаре и јавићемо вам се.

Повезани постови: