Czym różnią się wzory Proxy, Decorator, Adapter i Bridge?

Patrzyłem na wzór Proxy i wydaje mi się bardzo podobny do wzoru dekoratora, adaptera i mostka. Czy coś źle zrozumiałam? Co za różnica? Dlaczego miałbym używać wzorca Proxy w stosunku do innych? Jak wykorzystywałeś je w przeszłości w rzeczywistych projektach?

Author: Artur Krajewski, 2008-12-08

13 answers

Proxy, Decorator, Adapter i Bridge są wariacjami na temat" owijania " klasy. Ale ich zastosowania są różne.

  • Proxy może być używany, gdy chcesz utworzyć instancję obiektu, ukryć fakt wywołania usługi zdalnej lub kontrolować dostęp do obiektu.

  • Dekorator jest również nazywany " inteligentnym Proxy."Jest to używane, gdy chcesz dodać funkcjonalność do obiektu, ale nie poprzez rozszerzenie jego typu. Pozwala to na zrób to w czasie wykonywania.

  • Adapter jest używany, gdy masz abstrakcyjny interfejs i chcesz mapować ten interfejs do innego obiektu, który ma podobną funkcję funkcjonalną, ale inny interfejs.

  • Bridge jest bardzo podobny do adaptera, ale nazywamy go Bridge, gdy zdefiniujesz zarówno abstrakcyjny interfejs, jak i podstawową implementację. Czyli nie dostosowujesz się do jakiegoś kodu legacy lub innych firm, jesteś projektantem całego kodu, ale musisz możliwość wymiany różnych implementacji.

  • Facade jest interfejsem wyższego poziomu (Czytaj: prostszym) do podsystemu jednej lub więcej klas. Załóżmy, że masz złożoną koncepcję, która wymaga reprezentowania wielu obiektów. Wprowadzanie zmian w tym zestawie obiektów jest mylące, ponieważ nie zawsze wiadomo, który obiekt ma metodę, którą należy wywołać. To czas na napisanie fasady, która zapewnia metody wysokiego poziomu dla wszystkich złożonych operacji, które można zrobić, aby kolekcja przedmiotów. Przykład: model domeny dla sekcji szkolnej, z metodami takimi jak countStudents(), reportAttendance(), assignSubstituteTeacher(), i tak dalej.

 577
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-04 17:30:34

Jak mówi Bill, ich przypadki użycia są różne.

Tak jak ich struktury.

  • Proxy i Decorator mają ten sam interfejs, co ich zawinięte typy, ale proxy tworzy instancję pod maską, podczas gdy dekorator bierze instancję w konstruktorze.

  • Adapter i Fasada oba mają inny interfejs niż to, co owijają. Ale adapter wywodzi się z istniejącego interfejs, natomiast fasada tworzy nowy interfejs.

  • Mostek i Adapter oba wskazują na istniejący Typ. Ale Most będzie wskazywał na typ abstrakcyjny, a adapter może wskazywać na typ betonowy. Mostek pozwala na sparowanie implementacji w czasie wykonywania, podczas gdy adapter Zwykle tego nie robi.

 165
Author: Merlyn Morgan-Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:01

Moje podejście do tematu.

Wszystkie cztery wzory mają wiele wspólnego, wszystkie cztery są czasami nieformalnie nazywane wrapperami lub wrapperami. Wszyscy używają kompozycji, owijania tematu i delegowania wykonania do tematu w pewnym momencie, mapowania jednego wywołania metody do innego. Oszczędzają one klientowi konieczność konstruowania innego obiektu i kopiowania wszystkich istotnych danych. Jeśli są mądrze używane, oszczędzają pamięć i procesor.

Poprzez promowanie luźnego sprzężenia uczyń raz stabilny kod mniej narażony na nieuniknione zmiany i lepiej czytelny dla innych programistów.

Adapter

Adapter dostosowuje obiekt (adaptee) do innego interfejsu. W ten sposób możemy dodać obiekt do zbioru nominalnie różnych typów.

Adapter ujawnia tylko odpowiednie metody dla Klienta, może ograniczyć wszystkie inne, ujawniając zamiary użytkowania dla konkretnych kontekstów, takich jak adaptacja biblioteki zewnętrznej, sprawiając, że wydaje się mniej ogólna i bardziej skupiona na nasze potrzeby aplikacji. Adaptery zwiększają czytelność i samoopis naszego kodu.

Adaptery chronią jedną drużynę przed lotnym kodem od innych drużyn; narzędzie ratujące życie przy kontaktach z offshore teamami; -)

Less mentioned ma na celu uniemożliwienie klasie obiektowej nadmiaru adnotacji. Przy tak wielu frameworkach opartych na adnotacjach staje się to ważniejsze niż kiedykolwiek.

Adapter pomaga ominąć ograniczenie Javy tylko jednego dziedziczenia. Może łączyć kilka adaptacji pod jedną kopertą dających wrażenie wielokrotnego dziedziczenia.

Kod mądry, Adapter jest "cienki". Nie powinno dodawać dużo kodu do klasy adaptee, poza tym po prostu wywołanie metody adaptee i okazjonalne konwersje danych niezbędne do wykonania takich wywołań.

Nie ma zbyt wielu dobrych przykładów adapterów w JDK lub podstawowych bibliotekach. Twórcy aplikacji tworzą Adaptery, aby dostosować biblioteki do specyfiki aplikacji interfejsy.

Dekorator

Dekorator nie tylko deleguje, nie tylko mapuje jedną metodę do drugiej, robi więcej, modyfikuje zachowanie niektórych metod subject, może zdecydować, że w ogóle nie wywołuje metody subject, deleguje do innego obiektu, obiektu helpera.

Dekoratory zazwyczaj dodają (transparentnie) funkcjonalności do zawiniętego obiektu, takie jak rejestrowanie, szyfrowanie, formatowanie lub kompresja do obiektu. Ta nowa funkcjonalność może przynieść dużo nowego kodu. Stąd dekoratorzy są zwykle znacznie "grubsze" wtedy Adaptery.

Dekorator musi być podklasą interfejsu obiektu. Mogą być używane przejrzyście zamiast jego tematów. Patrz BufferedOutputStream, jest on nadal strumieniem wyjściowym i może być używany jako taki. Jest to duża różnica techniczna w stosunku do adapterów.

Text book przykłady całej rodziny dekoratorów jest łatwo w JDK-Java IO. Wszystkie klasy jak BufferedOutputStream, FilterOutputStream I ObjectOutputStream są dekoratorów OutputStream. Mogą być warstwami cebuli, gdzie jeden dekorator jest ponownie dekorowany, dodając więcej funkcjonalności.

Proxy

Proxy nie jest typowym opakowaniem. Zawinięty obiekt, temat proxy, może jeszcze nie istnieć w momencie tworzenia proxy. Proxy często tworzy je wewnętrznie. Może to być ciężki obiekt tworzony na żądanie lub obiekt zdalny w innym JVM lub innym węźle sieciowym, a nawet obiekt inny niż Java, komponent w kodzie natywnym. W ogóle nie musi być konieczne zawijanie lub delegowanie do innego obiektu.

Najbardziej typowymi przykładami są zdalne proxy, ciężkie inicjalizatory obiektów i proxy dostępu.

  • Zdalne Proxy – temat jest na zdalnym serwerze, inny JVM lub nawet non System Java. Proxy tłumaczy wywołania metody na wywołania RMI / REST/SOAP lub cokolwiek jest potrzebne, chroniąc klienta przed narażeniem na bazowe technologia.

  • Lazy Load Proxy-w pełni inicjalizuj obiekt tylko przy pierwszym użyciu lub pierwsze intensywne użytkowanie.

  • Access Proxy-Kontrola dostępu do obiektu.

Fasada

Fasada jest ściśle związana z zasadą najmniejszej wiedzy (prawo Demeter). Fasada jest bardzo podobna do adaptera. Obie owijają, obie mapują jeden obiekt na drugi, ale różnią się intencją. Elewacja spłaszcza złożoną strukturę przedmiotu, złożonego wykresu obiektowego, upraszczając dostęp do złożonej struktury.

Elewacja struktura, zapewniając do niej płaski interfejs. Zapobiega to narażeniu obiektu Klienta na wewnętrzne relacje w strukturze podmiotu, co promuje luźne sprzężenie.

Most

Bardziej skomplikowany wariant wzorca adaptera, w którym nie tylko implementacja jest różna, ale także abstrakcja. Dodaje do delegacji jeszcze jedną indykację. Dodatkową delegacją jest most. Oddziela Adapter nawet od interfejsu adaptacyjnego. Zwiększa złożoność bardziej niż jakakolwiek inna wzory owijania, więc stosuj ostrożnie.

Różnice w konstruktorach

Różnice w wzorach są również oczywiste, gdy patrzymy na ich konstruktory.

  • Proxy nie otacza istniejącego obiektu. W konstruktorze nie ma tematu.

  • Dekorator i Adapter owija już istniejący obiekt i taki jest zazwyczaj
    przewidziane w konstruktorze.

  • Elewacja konstruktor bierze element główny całego grafu obiektu, w przeciwnym razie wygląda tak samo jak Adapter.

Przykład prawdziwego życia – Adapter JAXB . Celem tego adaptera jest odwzorowanie prostej klasy płaskiej na bardziej złożoną strukturę wymaganą zewnętrznie i zapobieganie" zanieczyszczaniu " klasy obiektowej nadmiernymi adnotacjami.

 47
Author: Espinosa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-04 03:29:12

Istnieje wiele nakładania się na siebie wielu wzorców GoF. Wszystkie są zbudowane na potędze polimorfizmu i czasami naprawdę różnią się intencją. (strategia a państwo)

Moje zrozumienie wzorców wzrosło 100-krotnie po przeczytaniu Head First Design Patterns .

Gorąco polecam!

 29
Author: Dinah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-31 02:26:30

Wszystkie dobre odpowiedzi ekspertów już wyjaśniły, co oznacza każdy wzór.

Będę ozdobić kluczowe punkty.

dekorator:

  1. Dodaj zachowanie do obiektu w czasie wykonywania. Dziedziczenie jest kluczem do osiągnięcia tej funkcjonalności, co jest zarówno zaletą, jak i wadą tego wzoru.
  2. modyfikuje zachowanie interfejsu.

Np. (z łańcuchem ) : java.io klasy pakietów związane z InputStream & OutputStream interfejsy

FileOutputStream fos1 = new FileOutputStream("data1.txt");  
ObjectOutputStream out1 = new ObjectOutputStream(fos1);

Proxy:

  1. użyj go do leniwej inicjalizacji, poprawy wydajności przez buforowanie obiektu i kontrolowanie dostępu do klienta / wywołującego. Może zapewniać alternatywne zachowanie lub wywoływać rzeczywisty obiekt. Podczas tego procesu może wytworzyć nowy obiekt.
  2. W przeciwieństwie do dekoratora , który pozwala na łączenie obiektów, Proxy nie pozwala chaining.

Np.: java.rmi klasy pakietów.

Adapter:

  1. pozwala dwóm niepowiązanym interfejsom współpracować poprzez różne obiekty , prawdopodobnie pełniąc tę samą rolę.
  2. modyfikuje oryginalny interfejs.

E. g. java.io.InputStreamReader (InputStream zwraca a Reader)

most:

  1. umożliwia zarówno abstrakcje, jak i implementacje niezależnie .
  2. wykorzystuje skład nad dziedziczeniem.

Np. klasy kolekcji w java.util. List zaimplementowane przez ArrayList.

Najważniejsze uwagi:

  1. Adapter zapewnia inny interfejs do jego przedmiotu. Proxy zapewnia ten sam interfejs. dekorator zapewnia ulepszony interfejs.
  2. Adapter zmienia obiekt interfejs, dekorator zwiększa obowiązki obiektu.
  3. dekorator oraz Proxy mają różne cele, ale podobne struktury
  4. Adapter sprawia, że wszystko działa po zaprojektowaniu; most sprawia, że działają przed nimi.
  5. most jest zaprojektowany z góry, aby abstrakcja i implementacja różniły się niezależnie. Adapter jest zmodernizowany, aby niepowiązane klasy współpracowały ze sobą
  6. dekorator umożliwia dodawanie obowiązków do obiektów bez podklasowania.

Spójrz na świetne pytania/artykuły dotyczące przykładów różnych wzorców projektowych

Kiedy stosować wzór dekoratora?

Kiedy używasz wzoru mostu? Czym się różni od adaptera wzór?

Różnice między wzorem Proxy i dekoratora

 8
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-20 06:19:08

Są dość podobne, a linie między nimi są dość szare. Proponuję przeczytać wpisy Proxy Patterni Decorator Pattern w C2 wiki.

Wpisy i dyskusje tam są dość obszerne, a także linki do innych istotnych artykułów. Nawiasem mówiąc, C2 wiki jest doskonała, gdy zastanawiasz się nad niuansami między różnymi wzorami.

Podsumowując wpisy c2, powiedziałbym, że dekorator dodaje / zmienia zachowanie, ale proxy ma więcej do zrobienia z kontrolą dostępu (Lazy instantiation, remote access, security etc). Ale jak powiedziałem, linie między nimi są szare, i widzę odniesienia do proxy, które mogą być łatwo postrzegane jako dekoratorów i vice versa.

 7
Author: Bent André Solheim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 22:19:44

To jest cytat z Head First Design Patterns

Definicje należy do książki. Przykłady należą do mnie.

Decorator - nie zmienia interfejsu, ale dodaje odpowiedzialności. Załóżmy, że masz interfejs samochodowy, kiedy zaimplementujesz to dla innego modelu samochodu (s, sv, sl), być może będziesz musiał Dodać więcej odpowiedzialności dla niektórych modeli. Jak ma szyberdach, poduszka powietrzna itp..

Adapter - konwertuje jeden interfejs na drugi. Masz samochód interfejs i chciałbyś, aby działał jak jeep. Więc bierzesz samochód, modyfikujesz go i zamieniasz w jeepa. Ponieważ to nie jest prawdziwy jeep. Ale zachowuje się jak jeep.

Fasada - ułatwia interfejs. Załóżmy, że masz interfejsy samochodu, samolotu, statku. Właściwie wszystko, czego potrzebujesz, to klasa, która wysyła ludzi z jednego miejsca do drugiego. Chcesz zdecydować, jakiego pojazdu użyć. Następnie zbierasz wszystkie te odniesienia do interfejsu Pod 1 parasolem i pozwól mu zdecyduj/deleguj, aby było to proste.

Head First: "fasada nie tylko upraszcza interfejs, ale oddziela klienta od podsystemu części składowych. Fasady i adaptery mogą obejmować wiele klas, ale celem fasady jest uproszczenie, podczas gdy adapter jest do konwersji interfejsu do czegoś innego."

 3
Author: Teoman shipahi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-13 00:03:48

Wszystkie z czterech wzorców obejmują zawijanie wewnętrznego obiektu/klasy z zewnętrznym, więc są bardzo podobne strukturalnie. Opisałbym różnicę według celu:

  • Proxy zamyka dostęp z zewnątrz na wewnętrzny.
  • dekorator modyfikuje lub rozszerza zachowanie wewnętrzne z zewnętrznymi.
  • Adapter konwertuje interfejs z wewnętrznego na zewnętrzny.
  • mostek oddziela niezmienną część zachowania (zewnętrzną) od zmiennej lub część zależna od platformy (wewnętrzna).

Oraz poprzez różnice między obiektami wewnętrznymi i zewnętrznymi:

  • w interfejsy Proxy są takie same.
  • w Dekoratorze interfejsy są takie same.
  • w adapterze interfejsy są różne formalnie, ale spełniają ten sam cel.
  • w Bridge interfejsy są różne koncepcyjnie.
 2
Author: Alexey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-21 10:30:41

Używam go dość często podczas korzystania z usług internetowych. Wzorzec Proxy powinien być prawdopodobnie przemianowany na coś bardziej pragmatycznego ,na przykład 'Wrapper Pattern'. Mam też bibliotekę, która jest Proxy do MS Excel. To sprawia, że bardzo łatwo zautomatyzować Excel, bez konieczności martwienia się o szczegóły tła, takie jak to, co wersja jest zainstalowana (jeśli w ogóle).

 1
Author: hmcclungiii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 18:36:53

Mówiąc o szczegółach realizacji, znajduję różnicę między Proxy a dekoratorem, adapterem, elewacją ... We wspólnej implementacji tych wzorców istnieje obiekt docelowy owinięty przez obiekt otaczający. Klient używa obiektu zamkniętego zamiast obiektu docelowego. Obiekt docelowy odgrywa ważną rolę w niektórych metodach zamykania obiektu.

Jednak w przypadku Proxy obiekt może odtwarzać niektóre metody samodzielnie, po prostu inicjalizuje obiekt docelowy podczas wywołania przez Klienta niektóre metody, w których potrzebuje obiektu docelowego biorą udział. To jest leniwa inicjalizacja. W przypadku innych wzorców obiekt otaczający jest praktycznie oparty na obiekcie docelowym. Tak więc obiekt docelowy jest zawsze inicjowany wraz z otaczającym obiektem w konstruktorach / seterach.

Inna sprawa, proxy robi dokładnie to, co robi cel, podczas gdy inne wzorce dodają więcej funkcjonalności do celu.

 1
Author: bnguyen82,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-03 09:59:12

[5]} chciałbym dodać przykłady do odpowiedzi Billa Karwinga (co jest świetne btw.) Dodam też kilka kluczowych różnic w implementacji, których w moim odczuciu brakuje

Cytowane fragmenty pochodzą z odpowiedzi [ https://stackoverflow.com/a/350471/1984346 (Bill Karwing)

Proxy, Decorator, Adapter i Bridge są wariacjami na temat" owijania " klasy. Ale ich zastosowania są różne.

  • Proxy Może być używany, gdy chcesz utworzyć instancję an obiekt, lub Ukryj fakt wywołania usługi zdalnej lub kontroluj dostęp do obiektu.

ProxyClass i ObjectClass, które są proxied, powinny zaimplementować ten sam interfejs, więc są wymienne

Przykład-obiekt proxy

class ProxyHumanGenome implements GenomeInterface  {
    private $humanGenome = NULL; 

    // humanGenome class is not instantiated at construct time
    function __construct() {
    }

    function getGenomeCount() {
        if (NULL == $this->humanGenome) {
            $this->instantiateGenomeClass(); 
        }
        return $this->humanGenome->getGenomeCount();
    }
} 
class HumanGenome implement GenomeInterface { ... }
  • dekorator jest również nazywany " inteligentnym Proxy."To jest używane, gdy chcesz dodać funkcjonalność do obiektu, ale nie rozszerzając jego Typ. Pozwala to na możesz to zrobić w czasie wykonywania.

DecoratorClass powinien (mógłby) zaimplementować rozszerzony interfejs ObjectClass. Tak więc ObjectClass może zostać zastąpiony przez DecoratorClass, ale nie odwrotnie.

Przykład-dodawanie funkcji dodawania

class DecoratorHumanGenome implements CheckGenomeInterface  {

    // ... same code as previous example

    // added functionality
    public function isComplete() {
        $this->humanGenome->getCount >= 21000
    }
}

interface CheckGenomeInterface extends GenomeInterface {

    public function isComplete();

}

class HumanGenome implement GenomeInterface { ... }
  • Adapter jest używany, gdy masz abstrakcyjny interfejs i chcesz mapować ten interfejs do innego obiektu, który ma podobną funkcjonalność rola, ale inny interfejs.

Impregnacja różnic Proxy, dekorator, Adapter

Adapter zapewnia inny interfejs do swojego obiektu. Proxy zapewnia ten sam interfejs. Dekorator zapewnia ulepszony interfejs.

  • Bridge jest bardzo podobny do adaptera, ale nazywamy go Bridge, gdy zdefiniuj zarówno abstrakcyjny interfejs, jak i podstawową implementację. Tj. nie dostosowujesz się do jakiegoś kodu legacy lub innych firm, jesteś projektant cały kod, ale musisz mieć możliwość wymiany różne implementacje.

  • Facade jest interfejsem wyższego poziomu (Czytaj: prostszym) do podsystemu jedna lub więcej klas. Załóżmy, że masz złożoną koncepcję, która wymaga wiele obiektów do reprezentowania. Dokonywanie zmian w tym zbiorze obiektów jest mylące, bo nie zawsze wiadomo, który obiekt ma metoda, którą musisz zadzwonić. To czas na napisanie fasady, która zapewnia metody wysokiego poziomu dla wszystkich złożone operacje, które możesz wykonać do kolekcji przedmiotów. Przykład: model domeny dla szkoły sekcja z metodami takimi jak countStudents(), reportAttendance(), assignSubstituteTeacher(), i tak dalej.

Większość informacji w tej odpowiedzi pochodzi z https://sourcemaking.com/design_patterns, który polecam jako doskonały zasób do wzorców projektowych.

 1
Author: nakashu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:29

Wierzę, że Kod da jasne pomysły(aby uzupełnić inne odpowiedzi, jak również). Proszę zobaczyć poniżej, (skupić typy, które klasa implementuje i zawija)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            /* Proxy */

            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("PROXY");
            Console.WriteLine(Environment.NewLine);

            //instead of creating here create using a factory method, the facory method will return the proxy
            IReal realProxy = new RealProxy();
            Console.WriteLine("calling do work with the proxy object ");
            realProxy.DoWork();

            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("ADAPTER");
            Console.WriteLine(Environment.NewLine);

            /*Adapter*/
            IInHand objectIHave = new InHand();
            Api myApi = new Api();
            //myApi.SomeApi(objectIHave); /*I cant do this, use a adapter then */
            IActual myAdaptedObject = new ActualAdapterForInHand(objectIHave);
            Console.WriteLine("calling api with  my adapted obj");
            myApi.SomeApi(myAdaptedObject);


            Console.WriteLine(Environment.NewLine);
            Console.WriteLine("DECORATOR");
            Console.WriteLine(Environment.NewLine);

            /*Decorator*/
            IReady maleReady = new Male();
            Console.WriteLine("now male is going to get ready himself");
            maleReady.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady femaleReady = new Female();
            Console.WriteLine("now female is going to get ready her self");
            femaleReady.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady maleReadyByBeautician = new Beautician(maleReady);
            Console.WriteLine("now male is going to get ready by beautician");
            maleReadyByBeautician.GetReady();

            Console.WriteLine(Environment.NewLine);

            IReady femaleReadyByBeautician = new Beautician(femaleReady);
            Console.WriteLine("now female is going to get ready by beautician");
            femaleReadyByBeautician.GetReady();

            Console.WriteLine(Environment.NewLine);

            Console.ReadLine();


        }
    }

    /*Proxy*/

    public interface IReal
    {
        void DoWork();
    }

    public class Real : IReal
    {
        public void DoWork()
        {
            Console.WriteLine("real is doing work ");
        }
    }


    public class RealProxy : IReal
    {
        IReal real = new Real();

        public void DoWork()
        {
            real.DoWork();
        }
    }

    /*Adapter*/

    public interface IActual
    {
        void DoWork();
    }

    public class Api
    {
        public void SomeApi(IActual actual)
        {
            actual.DoWork();
        }
    }

    public interface IInHand
    {
        void DoWorkDifferently();
    }

    public class InHand : IInHand
    {
        public void DoWorkDifferently()
        {
            Console.WriteLine("doing work slightly different ");
        }
    }

    public class ActualAdapterForInHand : IActual
    {
        IInHand hand = null;

        public ActualAdapterForInHand()
        {
            hand = new InHand();
        }

        public ActualAdapterForInHand(IInHand hnd)
        {
            hand = hnd;
        }

        public void DoWork()
        {
            hand.DoWorkDifferently();
        }
    }

    /*Decorator*/

    public interface IReady
    {
        void GetReady();
    }

    public class Male : IReady
    {
        public void GetReady()
        {
            Console.WriteLine("Taking bath.. ");
            Console.WriteLine("Dress up....");
        }
    }

    public class Female : IReady
    {
        public void GetReady()
        {
            Console.WriteLine("Taking bath.. ");
            Console.WriteLine("Dress up....");
            Console.WriteLine("Make up....");
        }
    }

    //this is a decorator
    public class Beautician : IReady
    {
        IReady ready = null;

        public Beautician(IReady rdy)
        {
            ready = rdy;
        }

        public void GetReady()
        {
            ready.GetReady();
            Console.WriteLine("Style hair ");

            if (ready is Female)
            {
                for (int i = 1; i <= 10; i++)
                {
                    Console.WriteLine("doing ready process " + i);
                }

            }
        }
    }

}
 0
Author: Abdul Kader Jeelani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-11 12:22:39

Wzorzec projektowy to nie matematyka, to połączenie sztuki i inżynierii oprogramowania. Nie ma nic podobnego do tego wymogu, musisz użyć proxy, bridge itp. Wzorce projektowe są tworzone w celu rozwiązania problemów. Jeśli przewidujesz problem projektowy, użyj go. Na podstawie doświadczenia dowiesz się o konkretnym problemie, którego wzoru użyć. Jeśli jesteś dobry w solidnych zasadach projektowania, zaimplementowałbyś wzorzec projektowy, nie wiedząc, że jest to wzorzec. Częstym przykładem jest statergy i wzorce fabryczne

Dlatego skoncentruj się bardziej na solidnych zasadach desighn, zasadach czystego kodowania i ttd

 -3
Author: Mahantesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 14:10:38