decoratore
Decorator (Decorator Pattern) consente di aggiungere nuove funzionalità ad un oggetto esistente senza modificarne la struttura. Questo tipo di modelli di progettazione appartengono modello strutturale, è disponibile come una classe wrapper.
Questo modello crea un decorativa, usato per avvolgere i metodi di classe e di classe originali nel mantenimento dell'integrità della firma sotto la premessa di fornire funzionalità aggiuntive.
Usiamo i seguenti esempi per dimostrare il modello di decoratore. Tra questi, si formerà una decorazione in diversi colori, senza cambiare la forma della classe.
introduzione
Intento: in modo dinamico a un oggetto di aggiungere alcuni ulteriori responsabilità.Maggiore funzionalità, il modello decoratore rispetto sottoclasse più flessibile.
Principalmente per risolvere: in generale, spesso utilizzata per estendere un patrimonio di classe per raggiungere, a causa dell'introduzione di una statiche caratteristiche di ereditarietà di classe e funzionalità con l'aumento esteso, la sottoclasse sarebbe gonfiarsi.
Quando usare: non si vuole un aumento nel caso di molte classi di estensione sottocategoria.
Come risolvere: dividere le specifiche responsabilità funzionali, mentre ereditando il modello decoratore.
Codice chiave: 1, gli atti di classe componentecome un ruolo astratta, non dovrebbe l'implementazione specifica. 2, un riferimenti alle classi modificati e componente di ereditarietà di classe, classi di estensione specifici override del metodo classe padre.
Esempi di applicazione: 1, il re delle scimmie 72 cambiamento quando diventa "tempio", ha semplicemente era una scimmia, ma ha una funzione di tempio.2, a prescindere di una cornice non ci può essere appeso al muro, ma di solito c'è una cornice, e il telaio è stato in realtà appeso alla parete. Prima appesa al muro, pittura può essere coperto con vetro, montato alla casa telaio; poi la pittura, vetro e telaio formato di un oggetto.
Vantaggi: decorative e decorazione può essere sviluppato in modo indipendente, non sono accoppiati tra loro, modello decorativo è un modo alternativo di ereditarietà, motivi decorativi può estendere dinamicamente una classe che implementa la funzione.
Svantaggi: più complessa a più strati decorativi.
scenari di utilizzo: 1, si estende una funzione di classe.2, la funzionalità di aumento dinamico, dinamica revocata.
Nota: È possibile sostituire l'ereditarietà.
realizzazione
Creeremo una interfacciaformae l'implementazione dell'interfacciaShapeclassi di entità. Poi creiamo una realizzazione di un'interfaccia astrattaForma ShapeDecoratordecorativo e l'oggettoShapecome le sue variabili di istanza.
RedShapeDecoratorè quello di raggiungere ilShapeDecoratorclassi dientità.
DecoratorPatternDemo,i nostri corsi dimostrativi utilizzandoRedShapeDecoratorper decorare oggettoShape.
fase 1
Creare un'interfaccia.
Shape.java
Forma interfaccia pubblica { void draw (); }
fase 2
Creare classe di entità che implementa l'interfaccia.
Rectangle.java
public class Rettangolo implementa Shape { @Override draw public void () { System.out.println ( "Shape: Rectangle"); } }
Circle.java
public class Circle implementa Shape { @Override draw public void () { System.out.println ( "Forma: Circle"); } }
fase 3
Creare raggiungere astratto interfacciaformadecorativa.
ShapeDecorator.java
public class ShapeDecorator astratta implementa Shape { protetto Forma decoratedShape; ShapeDecorator pubblico (Forma decoratedShape) { this.decoratedShape = decoratedShape; } draw public void () { decoratedShape.draw (); } }
fase 4
Creare un soggetto decorativo classeShapeDecoratorestesa.
RedShapeDecorator.java
public class RedShapeDecorator estende ShapeDecorator { RedShapeDecorator pubblico (Forma decoratedShape) { super (decoratedShape); } @Override draw public void () { decoratedShape.draw (); setRedBorder (decoratedShape); } setRedBorder private void (Forma decoratedShape) { System.out.println ( "Colore bordo: rosso"); } }
fase 5
RedShapeDecoratorutilizzare per decorare oggettoShape.
DecoratorPatternDemo.java
public class DecoratorPatternDemo { Main (string [] args) {public static void Forma del cerchio = new Circle (); Forma redCircle = new RedShapeDecorator (nuova Circle ()); Forma redRectangle = new RedShapeDecorator (new Rectangle ()); System.out.println ( "Circle con bordo normale"); circle.draw (); System.out.println ( "\ nCircle di bordo rosso"); redCircle.draw (); System.out.println ( "\ nRectangle di bordo rosso"); redRectangle.draw (); } }
passo 6
Verifica uscita.
Cerchio con bordo normale Forma: Circle Circolo di bordo rosso Forma: Circle Colore bordo: rosso Rettangolo di bordo rosso Forma: Rettangolo Colore bordo: rosso