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!