Design pattern class adapter

di il
10 risposte

Design pattern class adapter

Salve a tutti, sono alle prese con i design pattern e non avendo la soluzione di questo esercizio base del class adapter non so se ho ragionato bene.
Ho ragionato facendo l'UML con IGrayPixel come target e RGBPixel come adaptee
Grazie a chi risponderà

Testo: si scriva un class adapter per la seguente classe RGBPixel per fare in modo che possa essere usata con un client che si aspetta l'interfaccia definita nella classe IGrayPixel. Per calcolare la luminosità di un pixel, a partire dalla tripletta RGB corrispondente, si usi la formula: grigio = 0.299*R+0.587*G+0.114*B


Target
class IGrayPixel{
public:
    virtual unsigned char getPixel() = 0; //return gray level
};
Adaptee
class RGBPixel{
public:
    RGBPixel(){_R = _G = _B = 100;};
    int getR(){return _R;};
    int getG(){return _G;};
    int getB(){return _B;};
    void setR(int R){_R = R;};
    void setG(int G){_G = G;};
    void setB(int B){_B = B;};

private:
    int _R;
    int _G;
    int _B;
};

Adapter

FILE .h

#include "RGBPixel.h"
#include "IGrayPixel.h"

class RGBIGreyAdapter : public RGBPixel, public IGrayPixel{
public:
    RGBIGreyAdapter(int _R, int _G, int _B) : RGBPixel(){}
    virtual ~RGBIGreyAdapter(){}
    // target
    virtual unsigned char getPixel()override;
};
FILE .cpp

unsigned char RGBIGreyAdapter::getPixel() {
        unsigned char Gray = static_cast<unsigned char>(0.299*getR() + 0.587*getG() +0.114*getB());
        return Gray;
}

10 Risposte

  • Re: Design pattern class adapter

    Un adapter e' una clesse che IMPLEMENTA un'interaccia e che CONTIENE al suo INTERNO un'altra classe: all'esterno si comporta come specificato dall'interfaccia che implementa, ma ALL'INTERNO usa la classe contenuta per ottenere le informazioni che poi rimaneggia per adattarle a quanto richiesto dall'interfaccia.

    Nel tuo caso: devi adattare un pixel per un monitor a colori in un pixel per un monitor bianco e nero.

    La tua implementazione NON E' UN ADAPTER: tu ESTENDI la classe originale per implementare la nuova interfaccia.

    Dove sta' l'inghippo? il tuo approccio NON PERMETTE DI USARE oggetti gia' esistenti.

    Pensala in questo modo: l'oggetto RGBPixel NON LO GESTISCI TU, ma codice scritto da altri e che NON PUOI modificare. Ma tu vuoi usare i pixel che ti vengono forniti dalla libreria (ad esempio) in un TUO codice.
  • Re: Design pattern class adapter

    Ho provato a rivedere un po' la teoria e ho continuato a ragionarci, l'unica cosa che mi è venuto in mente è di rendere privata RGBPixel però per il resto non saprei cosa modificare, forse mi sfugge qualcosa.
    in particolare ho dei dubbi sul costruttore.
    grazie.
  • Re: Design pattern class adapter

    Leggi BENE quello che ho scritto: le cose FONDAMENTALI sono scritte in MAIUSCOLO.

    Quel codice lo puoi ribaltare come un calzino

    Aiutino: la RGBPixel sta' nel posto sbagliato
  • Re: Design pattern class adapter

    In che senso la RGBPixel sta nel posto sbagliato? nel costruttore della classe Adapter?
    grazie
  • Re: Design pattern class adapter

    Spero di non essere totalmente fuori strada


    file.cpp
    #include "RGBPixel.h"
    #include "IGrayPixel.h"
    
    class RGBIGreyAdapter : public IGrayPixel, private RGBPixel {
    public:
        RGBIGreyAdapter(): RGBPixel(){R = getR(), G = getG(), B = getB();};
        virtual ~RGBIGreyAdapter(){}
    
        virtual unsigned char getPixel()override;
    
    private:
        int R;
        int G;
        int B;
    };
    
    file.h
    #include "RGBIGreyAdapter.h"
    
    unsigned char RGBIGreyAdapter::getPixel() {
        unsigned char Gray = static_cast<unsigned char>(0.299*R+ 0.587*G +0.114*B);
            return Gray;
    }
    
  • Re: Design pattern class adapter

    Perdindirindina, LEGGI le cose che ti scriviamo!!!!!

    la RGBPixel

    DEVE STARE DENTRO

    la classe che implementa l'interfaccia GrayPixel:

    D E N T R O
  • Re: Design pattern class adapter

    Io ho letto e riletto più volte quanto mi hai scritto e non solo dopo che mi hai espressamente sottolineato di farlo, ma purtroppo continuo a non capire, potresti farmi un esempio con del codice?
    che significa nella pratica, nel codice, che la RGBPixel deve stare dentro la classe che implementa l'interfaccia GrayPixel?
    Tra l'altro dopo questo esercizio con il class adapter devo fare la stessa cosa con object adapter, quindi devo capire bene.
    Mi scuso per non aver capito e spero tu non perda la pazienza.
    grazie in anticipo.
  • Re: Design pattern class adapter

    Meglio?

    
    
    #include "IGreyPixel.h"
    #include "RGBPixel.h"
    
    class RGBIGreyAdapter : public IGreyPixel{
    public:
        RGBIGreyAdapter(RGBPixel*);
        ~RGBIGreyAdapter();
        virtual unsigned char getPixel()override;
    private:
        RGBPixel* adaptee;
    };
    
    
    #include "RGBIGreyAdapter.h"
    RGBIGreyAdapter::RGBIGreyAdapter(RGBPixel * RGB) {
        adaptee = RGB;
    }
    unsigned char RGBIGreyAdapter::getPixel() {
        unsigned char Grey = static_cast<unsigned char>(0.299*adaptee->getR()+ 0.587*adaptee->getG() +0.114*adaptee->getB());
        return Grey;
    }
    
  • Re: Design pattern class adapter

    Wiikipedia colpisce ancora
    Meglio!
  • Re: Design pattern class adapter

    Quindi ora va bene?

    In che senso Wikipedia?
Devi accedere o registrarti per scrivere nel forum
10 risposte