Arvioitu lukuaika: 6 minuti
Suunnittelumalli ei ole koodia, jonka voimme kopioida ja lisätä ohjelmaomme, kuten voimme tehdä vakiofunktioiden tai kirjastojen kanssa. Suunnittelumalli on yleinen käsite, joka pystyy ratkaisemaan tietyn ongelman. Periaatteessa malli, jonka yksityiskohtia voimme seurata ja toteuttaa ohjelmamme todellisuutta vastaavan ratkaisun.
Mallit sekoitetaan usein algoritmeihin, koska molemmat käsitteet kuvaavat tyypillisiä ratkaisuja joihinkin tunnettuihin ongelmiin. Vaikka algoritmi defiJos aina on olemassa selkeä joukko toimia, joilla voidaan saavuttaa tietty tavoite, malli on korkeamman tason kuvaus ratkaisusta. Saman mallin koodi kahdessa eri ohjelmassa voi olla erilainen.
Haluttaessa tehdä vertaus, voimme ajatella ruoanlaittoreseptiä: molemmilla on selkeät askeleet tavoitteen saavuttamiseksi. Malli on kuitenkin enemmän kuin projekti, jonka tulos ja ominaisuudet näkee, mutta tarkka toteutusjärjestys riippuu meistä koodin kirjoittajista.
Useimmat kuviot kuvataan hyvin muodollisesti, jotta ihmiset voivat toistaa ne monissa yhteyksissä. Katsotaanpa alla elementtejä, jotka ovat mallin kuvauksessa:
Ohjelmoija voi kehittää ohjelmistoja tietämättä suunnittelumallien olemassaolosta. Monet tekevät, ja tästä syystä he toteuttavat joitain suunnitelmia tietämättään. Mutta miksi meidän pitäisi sitten käyttää aikaa niiden oppimiseen?
Suunnittelumallit eroavat monimutkaisuuden, yksityiskohtaisuuden ja sovellettavuuden laajuuden suhteen koko suunnitellussa järjestelmässä.
Vastaavasti voimme tehdä risteyksestä turvallisemman asentamalla muutaman liikennevalon tai rakentamalla kokonaisen monitasoisen liittymän, jossa on maanalaisia jalankulkijoiden käytäviä.
Usein kutsutaan yksinkertaisimpia, matalan tason malleja idiomit . Ne koskevat yleensä vain yhtä ohjelmointikieltä.
Yleisimmät ja korkean tason mallit ovat arkkitehtonisia malleja . Kehittäjät voivat toteuttaa nämä mallit käytännössä millä tahansa kielellä. Toisin kuin muita kuvioita, niitä voidaan käyttää koko sovelluksen arkkitehtuurin suunnitteluun.
Lisäksi kaikki mallit voidaan luokitella niiden mukaan Intento tai tarkoitus. Kolme pääluokkaa ovat:
Julkisivu on rakennesuunnittelumalli, joka tarjoaa yksinkertaistetun käyttöliittymän kirjastoon, kehykseen tai mihin tahansa muuhun monimutkaiseen luokkiin.
Oletetaan, että meidän on saatava ohjelmisto toimimaan suuren objektijoukon perusteella, jotka kuuluvat hienostuneeseen kirjastoon tai kehykseen. Normaalisti meidän pitäisi alustaa kaikki nämä objektit, seurata riippuvuuksia, suorittaa menetelmät oikeassa järjestyksessä ja niin edelleen.
Tämän seurauksena luokkien liiketoimintalogiikka kytkeytyisi tiukasti kolmansien osapuolien luokkien toteutusyksityiskohtiin, mikä tekisi niistä vaikea ymmärtää ja hallita.
Una facade
on luokka, joka tarjoaa yksinkertaisen käyttöliittymän monimutkaiseen osajärjestelmään, joka sisältää monia liikkuvia osia. A facade
voi tarjota rajoitettuja toimintoja verrattuna suoraan alijärjestelmän kanssa toimimiseen. Se sisältää kuitenkin vain ne ominaisuudet, joista asiakkaat todella välittävät.
Ota yksi facade
se on hyödyllinen, kun meidän on integroitava sovellus kehittyneeseen kirjastoon, jossa on kymmeniä ominaisuuksia, mutta tarvitsemme vain pienen osan sen toiminnoista.
Esimerkiksi sovellus, joka lataa sosiaaliseen mediaan lyhyitä hauskoja videoita kissoista, voisi mahdollisesti käyttää ammattimaista videomuunnoskirjastoa. Tarvitsemme kuitenkin vain luokan yhdellä menetelmällä encode(filename, format)
. Kun olet luonut tällaisen luokan ja yhdistänyt sen videomuunnoskirjastoon, meillä on ensimmäinen facade
.
Esimerkiksi puhelinkeskuksen puhelinoperaattori on kuin a facade
. Itse asiassa, kun soitamme myymälän puhelinpalveluun tehdäksemme puhelintilauksen, operaattori on meidän facade
myymälän kaikkiin palveluihin ja osastoihin. Operaattori tarjoaa yksinkertaisen puherajapinnan tilausjärjestelmään, maksuyhdyskäytäviin ja erilaisiin toimituspalveluihin.
Ajatella Julkisivu yksinkertaisena sovittimena monimutkaisille alajärjestelmille. Facade
eristää monimutkaisuuden yhden luokan sisällä ja sallii muiden sovelluskoodien käyttää yksinkertaista käyttöliittymää.
Tässä esimerkissä Facade
piilottaa YouTube-sovellusliittymän ja FFmpeg-kirjaston monimutkaisuuden asiakaskoodilta. Sen sijaan, että asiakas työskentelee kymmenien luokkien kanssa, hän käyttää yksinkertaista menetelmää Facadessa.
<?php
namespace RefactoringGuru\Facade\RealWorld;
/**
* The Facade provides a single method for downloading videos from YouTube. This
* method hides all the complexity of the PHP network layer, YouTube API and the
* video conversion library (FFmpeg).
*/
class YouTubeDownloader
{
protected $youtube;
protected $ffmpeg;
/**
* It is handy when the Facade can manage the lifecycle of the subsystem it
* uses.
*/
public function __construct(string $youtubeApiKey)
{
$this->youtube = new YouTube($youtubeApiKey);
$this->ffmpeg = new FFMpeg();
}
/**
* The Facade provides a simple method for downloading video and encoding it
* to a target format (for the sake of simplicity, the real-world code is
* commented-out).
*/
public function downloadVideo(string $url): void
{
echo "Fetching video metadata from youtube...\n";
// $title = $this->youtube->fetchVideo($url)->getTitle();
echo "Saving video file to a temporary file...\n";
// $this->youtube->saveAs($url, "video.mpg");
echo "Processing source video...\n";
// $video = $this->ffmpeg->open('video.mpg');
echo "Normalizing and resizing the video to smaller dimensions...\n";
// $video
// ->filters()
// ->resize(new FFMpeg\Coordinate\Dimension(320, 240))
// ->synchronize();
echo "Capturing preview image...\n";
// $video
// ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
// ->save($title . 'frame.jpg');
echo "Saving video in target formats...\n";
// $video
// ->save(new FFMpeg\Format\Video\X264(), $title . '.mp4')
// ->save(new FFMpeg\Format\Video\WMV(), $title . '.wmv')
// ->save(new FFMpeg\Format\Video\WebM(), $title . '.webm');
echo "Done!\n";
}
}
/**
* The YouTube API subsystem.
*/
class YouTube
{
public function fetchVideo(): string { /* ... */ }
public function saveAs(string $path): void { /* ... */ }
// ...more methods and classes...
}
/**
* The FFmpeg subsystem (a complex video/audio conversion library).
*/
class FFMpeg
{
public static function create(): FFMpeg { /* ... */ }
public function open(string $video): void { /* ... */ }
// ...more methods and classes... RU: ...дополнительные методы и классы...
}
class FFMpegVideo
{
public function filters(): self { /* ... */ }
public function resize(): self { /* ... */ }
public function synchronize(): self { /* ... */ }
public function frame(): self { /* ... */ }
public function save(string $path): self { /* ... */ }
// ...more methods and classes... RU: ...дополнительные методы и классы...
}
/**
* The client code does not depend on any subsystem's classes. Any changes
* inside the subsystem's code won't affect the client code. You will only need
* to update the Facade.
*/
function clientCode(YouTubeDownloader $facade)
{
// ...
$facade->downloadVideo("https://www.youtube.com/watch?v=QH2-TGUlwu4");
// ...
}
$facade = new YouTubeDownloader("APIKEY-XXXXXXXXX");
clientCode($facade);
Ercole Palmeri
Veeamin Coveware tarjoaa jatkossakin kyberkiristystapahtumien reagointipalveluita. Coveware tarjoaa rikosteknisiä ja korjaavia ominaisuuksia…
Ennakoiva huolto mullistaa öljy- ja kaasualan innovatiivisella ja ennakoivalla lähestymistavalla laitosten hallintaan.…
Britannian CMA on antanut varoituksen Big Techin käyttäytymisestä tekoälymarkkinoilla. Siellä…
Euroopan unionin rakennusten energiatehokkuuden parantamiseksi laatima "Green Houses" -asetus on saanut lainsäädäntöprosessinsa päätökseen…