Sablonul de proiectare Decorator
Descriere
Sablonul decorator permite modificarea comportamentului sau adaugarea unui comportament suplimentar pentru o instanta in mod dinamic. Acest sablon este o alternativa la mostenire - permitand asadar adugarea sau modificarea comportamentului unei clase utilizand compozitia si nu mostenirea.
Diagrama UML
Exemplu
Varianta 1
Implementarea conform diagramei UML de mai sus este prezentata in listingul de mai jos.
interface Car{ void start(); void stop(); } abstract class Decorator implements Car{ Car car; public Decorator(Car car) { this.car = car; } } class DieselCar implements Car{ @Override public void start() { System.out.println("Start diesel car"); } @Override public void stop() { System.out.println("Stop diesel car"); } } class ElectricCar implements Car{ @Override public void start() { System.out.println("Start electric car"); } @Override public void stop() { System.out.println("Stop electric car"); } } class AlarmCarDecorator extends Decorator{ public AlarmCarDecorator(Car car) { super(car); } @Override public void start() { System.out.println("Turon off alarm!"); car.start(); } @Override public void stop() { car.stop(); System.out.println("Turon on alarm!"); } } class DoorsCheckCarDecorator extends Decorator{ public DoorsCheckCarDecorator(Car car) { super(car); } public void start() { car.start(); System.out.println("Look doors!"); } public void stop() { car.stop(); System.out.println("Unlook doors doors!"); } } public class TestDecorator { public static void main(String[] args){ DieselCar d1 = new DieselCar(); d1.start(); d1.stop(); System.out.println("--------------"); AlarmCarDecorator a1 = new AlarmCarDecorator(d1); a1.start(); a1.stop(); System.out.println("--------------"); AlarmCarDecorator a2 = new AlarmCarDecorator(new ElectricCar()); a2.start(); a2.stop(); System.out.println("--------------"); DoorsCheckCarDecorator k = new DoorsCheckCarDecorator(a2); k.start(); k.stop(); } }
Varianta 2
O varianta simplificata in care nu se utilizeaza o clasa abstracta Decorator este prezentata mai jos.
interface Car{ void start(); void stop(); } class DieselCar implements Car{ @Override public void start() { System.out.println("Start diesel car"); } @Override public void stop() { System.out.println("Stop diesel car"); } } class ElectricCar implements Car{ @Override public void start() { System.out.println("Start electric car"); } @Override public void stop() { System.out.println("Stop electric car"); } } class AlarmCarDecorator implements Car{ Car car; public AlarmCarDecorator(Car car) { this.car = car; } @Override public void start() { System.out.println("Turon off alarm!"); car.start(); } @Override public void stop() { car.stop(); System.out.println("Turon on alarm!"); } } class DoorsCheckCarDecorator implements Car{ Car car; public DoorsCheckCarDecorator(Car car) { this.car = car; } public void start() { car.start(); System.out.println("Look doors!"); } public void stop() { car.stop(); System.out.println("Unlook doors doors!"); } } public class TestDecorator { public static void main(String[] args){ DieselCar d1 = new DieselCar(); d1.start(); d1.stop(); System.out.println("--------------"); AlarmCarDecorator a1 = new AlarmCarDecorator(d1); a1.start(); a1.stop(); System.out.println("--------------"); AlarmCarDecorator a2 = new AlarmCarDecorator(new ElectricCar()); a2.start(); a2.stop(); System.out.println("--------------"); DoorsCheckCarDecorator k = new DoorsCheckCarDecorator(a2); k.start(); k.stop(); } }
Rezultatul executiei programului de mai sus este:
Start diesel car Stop diesel car -------------- Turn on off alarm! Start diesel car Stop diesel car Turn on on alarm! -------------- Turn on off alarm! Start electric car Stop electric car Turn on on alarm! -------------- Turn on off alarm! Start electric car Look doors! Stop electric car Turn on on alarm! Unlook doors doors!