Modelul de proiectare a decoratorului este cam ca o napolitana

Modelul decoratorului înseamnă adăugarea de funcții suplimentare la un obiect existent.

Suna ca franceza?

Fără griji.

Vom reveni la acest lucru mai târziu.

Să aruncăm o privire mai întâi la unele napolitane!

Partea genială despre waffles este că încep simplu și simplu. Deoarece sunt simple, aproape totul are un gust bun cu ele

Unele topping-uri obișnuite pentru napolitane sunt căpșuni, afine, mure, banane, migdale și siropuri.

Să încercăm să creăm o colecție de obiecte waffle diferite.

Vor fi StrawberryWaffle, BlueberryWaffle, BlackberryWaffle, BananaWaffle, MigondWaffle și SyrupWaffle.

Stai, putem avea căpșuni și afine pe aceeași waffle. Acest lucru ne oferă un StrawberryBlueberryWaffle.

Putem avea, de asemenea, căpșuni și mure pe aceeași waffle. Acest lucru ne oferă un StrawberryBlackberryWaffle.

Nimeni nu ne interzice să punem trei rafturi pe aceeași waffle. Acest lucru ne oferă un StrawberryBlueberryBlackberryWaffle.

Pentru a simplifica lucrurile, să luăm în considerare căpșunile, afinele și murele ca fiind posibile toppinguri. Există opt combinații diferite [1].

Acest lucru înseamnă că trebuie să creăm opt obiecte diferite pentru colecția noastră de waffle?

Dacă adăugăm banane în lista noastră de topping-uri potențiale, există 16 combinații diferite [2].

Este evident că adăugarea unui singur topping în lista noastră de topuri provoacă o explozie în colecția noastră de waffle.

Nu este posibilă crearea unei clase de waffle diferite pentru fiecare combinație posibilă de toppinguri. Trebuie să existe o modalitate mai bună de a face acest lucru.

Ce se întâmplă dacă, atunci când dorim un StrawberryWaffle în loc să creăm un StrawberryWaffle, creăm o Waffle și adăugăm căpșuni la ea?

Ce zici de StrawberryBlueberryWaffle atunci?

Can Putem crea o Waffle, adăugăm căpșuni în ea și adăugăm afine!

Crearea de clase Waffle

Să aruncăm o privire la clasa de waffle simple:

Puteți crea o napolitana, o puteți servi și o puteți mânca astfel:

Și iată clasa StrawberryWaffle:

Observați că trecem un obiect de waffle în interiorul constructorului StrawberryWaffle pentru a crea un StrawberryWaffle.

Clasa StrawberryWaffle are:

  1. Vafa trecuta
  2. Căpșuni ca topping
  3. O metodă de servire care numește metoda de servire a wafflei trecute. Apoi imprimeuri acoperite cu căpșuni
  4. O metodă de mâncare care numește vasa trecută este metoda de mâncare, apoi imprime și apoi mănâncă niște căpșuni

Puteți crea o waffle de căpșuni, o puteți servi și o puteți mânca astfel:

Iată clasele BlueberryWaffle și BlackberryWaffle:

Și le puteți folosi astfel:

Scoaterea părții comune

Observând clasa StrawberryWaffle, clasa BlueberryWaffle și clasa BlackberryWaffle sunt aproape identice, cu excepția toppingului, putem scoate părțile comune ca o clasă părinte.

În WaffleDecorator, toppingul nu mai este un atribut al obiectului. În schimb, este o metodă care poate fi înlocuită de o clasă de copii.

Acum putem rescrie StrawberryWaffle, BlueberryWaffle și BlackberryWaffle pentru a moșteni WaffleDecorator pentru a obține aceste funcționalități comune:

Și ar trebui să funcționeze la fel ca înainte:

Iată clasele pe care le creăm:

Crearea unui waffle BlueberryStrawberry

Acum avem Waffle, StrawberryWaffle, BlueberryWaffle și BlackberryWaffle.

Este timpul să atingem obiectivul pe care ni l-am propus inițial:

creați o Waffle, adăugați căpșuni și adăugați afine în ea.

La fel ca aceasta:

Și putem:

Ce se întâmplă?!

Să aruncăm o privire mai atentă asupra modului în care am creat blueberry_strawberry_waffle:

Mai întâi, am creat o simplă_waffle cu Waffle: plain_waffle = Waffle.new

Atunci am creat strawberry_waffle trecând plain_waffle în constructorul StrawberryWaffle. strawberry_waffle = StrawberryWaffle.new (plain_waffle)

Este demn de remarcat faptul că atunci când creăm strawberry_waffle, păstrăm trecutul în plain_waffle ca o variabilă de instanță a strawberry_waffle:

După cum putem vedea, strawberry_waffle.waffle și plain_waffle sunt același obiect:

În acest moment, când apelăm la strawberry_waffle.serve. Mai întâi apelăm la plain_waffle.serve, apoi imprimăm topped cu căpșuni.

Pentru strawberry_waffle.eat, apelăm mai întâi la plain_waffle.eat, apoi imprimăm și apoi mâncăm câteva căpșuni.

Creăm blueberry_strawberry_waffle trecând constructorul strawberry_waffleinto prin constructorul BlueberryWaffle. blueberry_strawberry_waffle = BlueberryStrawberryWaffle.new (strawberry_waffle)

Când creăm blueberry_strawberry_waffle, păstrăm trecutul în strawberry_waffle ca variabilă de instanță a blueberry_strawberry_waffle:

Când apelăm blueberry_strawberry_waffle.serve, apelăm mai întâi la strawberry_waffle.serve. Ceea ce numește plain_waffle.serve, apoi imprime topped cu căpșuni. Apoi imprimați topped cu afine.

Când apelăm blueberry_strawberry_waffle.eat, apelăm mai întâi la strawberry_waffle.eat. Ceea ce numește plain_waffle.eat, apoi imprimă și apoi mănâncă niște căpșuni. Apoi imprimați și apoi mâncați niște afine.

Cheia magiei:

strawberry_waffle este construit pe partea de sus a plain_waffle. Și blueberry_strawberry_waffle este construit pe partea de sus a strawberry_waffle.

Cheia de a putea construi gofre una peste alta este că toate vafele trebuie să se supună aceleiași interfețe.

Toate vafele au o metodă de servire și o metodă de mâncare.

Acesta este motivul pentru care, în cadrul StrawberryWaffle / BlueberryWaffle / BlackberryWaffleclass, suntem siguri că napolitana trecută are o metodă de servire și o metodă de mâncare.

Și putem folosi metoda de servire și metoda de mâncare de la vafa trecută atunci când definim o nouă metodă de servire și o nouă metodă de mâncare.

Un WaffleDecorator nu-i pasă de felul de waffle. Poate fi o simplă-waffle, o căpșune-waffle sau o strălucire-waffle.

Tot ce contează este că un WaffleDecorator ia o waffle și returnează o waffle îmbunătățită. Waffle-ul pe care îl ia și waffle-ul pe care îl întoarce se supun aceleiași interfețe.

Deoarece toate decoratoarele care preiau și se întorc waffle se supun aceleiași interfețe, rezultatul unui decorator poate fi trecut într-un alt decorator.

La fel ca aceasta:

sau asta:

Acum, cu Waffle, StrawberryWaffle, BlueberryWaffle și BlackberryWaffle, putem crea toate cele opt waffle diferite.

Adăugarea de banane în lista noastră de top este la fel de ușor:

Tocmai ai învățat modelul de decorator!

Iată definiția sa:

Decoratorul atacă responsabilități suplimentare unui obiect în mod dinamic.

takeaways:

  1. Modelul decoratorului înseamnă adăugarea cu ușurință a unor funcții suplimentare la un obiect existent.
  2. Obiectul care trebuie decorat (cel trecut în toți decoratorii) și obiectele returnate de la decoratori trebuie să se supună aceleiași interfețe.

Multumesc pentru citit! Sper sa va placa articolul.

Public în săptămânalul sihui.io.

Abonați-vă, astfel încât să nu pierdeți următorul articol din serie.

Data viitoare vom arunca o privire la ...

[1] PlainWaffle, StrawberryWaffle, BlueberryWaffle, BlackberryWaffle, StrawberryBlueberryWaffle, StrawberryBlackberryWaffle, BlueberryBlackberryWaffle și StrawberryBlueberryBlackberryWaffle.

[2] C (4, 0) + C (4, 1) + C (4, 2) + C (4, 3) + C (4, 4) = 16