80 likes | 172 Views
Strategy Pattern. Beslektede algoritmer. Isolere klient fra algoritme. Klienter trenger av og til helt forskjellige måter å gjøre det samme på Men klienten selv kan ikke inneholde kode for alle mulige varianter I stedet lages det noen få kontraktmetoder i interface eller abstrakte klasser
E N D
StrategyPattern Beslektede algoritmer
Isolere klient fra algoritme • Klienter trenger av og til helt forskjellige måter å gjøre det samme på • Men klienten selv kan ikke inneholde kode for alle mulige varianter • I stedet lages det noen få kontraktmetoder i interface eller abstrakte klasser • Dermed kan en instans som kapsler inn en algoritme sendes som argument til klienten • Klienten bruker den innkapslede algoritmen uten å måtte kjenne den konkrete strategien
Prinsippskisse • Klienten skal utføre ulike service-operasjoner • Klienten har aggregert eller komponert et strategiobjekt som vet hvordan
Eksempelskisse • GoF bruker dette eksemplet på side 315 • Det handler om ulike strategier for linjeskift • Composition implementerer ikke strategiene selv • Mønsteret minner derfor om Decorator • Forskjellen på mønstre er av og til bestemt av hensikten med mønsteret
Instans av strategypattern • Prosjektet simpletransport bruker Strategy • Et eksempel med formatering vises på side 118 • Spesialiseringer av DefaultTableCellRenderer gir ulike strategier • Installering av strategiobjektet forstås ved hjelp av MVC • Contexter TableColumn komponert i TableColumnModel • Strategien installeres med meldingen setCellRenderer
setValue som kontraktmetode • Kontraktmetoden er definert i DefaultTableRenderer • Kontrakten er at domeneklassene kan overstyre metoden • Kontekstobjektet er altså en klasse i rammeverket • Domeneklassen Listpane er klient for kontekstobjektet • Kontekstobjektet tilhører MVC-gruppen i rammeverkets brukerkontroll • Det er altså rammeverkets brukerkontroll som bruker kontraktmetoden setValue
GoFsApplicability list • Flere klasser med lignende ansvar er kun forskjellig i oppførsel (behaviour) • Det er behov for ulike varianter av en algoritme som kan implementeres i et klassehierarki • Klientene kjenner ikke datasettene eller algoritmene som utnyttes i strategiobjektene • Klasser som definerer ulike algoritmer og forgreninger basert på switch- eller lister med if-else får høy kompleksitet og blir vanskelige å vedlikeholde. Flytt hver gren inn i hver sin strategiklasse i stedet
Referanser til prosjekter • simpletransportbruker Strategy for å formatere ulike lister. Se programkode 71 og 72. • Alle prosjektene bruker Strategi som layoutobjekter i paneler eller i spesialiseringer av Jframe, som nevnt blant annet i prosjekt 4, side 55. • easylibbruker Strategy i overføring av data mellom properties og XML, se side 96 • simplediagram bruker Strategy for å fremstille sammensatte figurer basert på Graphics2D, interfacet Shape og metoden draw, se side 147